mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-14 16:04:10 +01:00
Compare commits
539 Commits
support/3.
...
issue/7746
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8103f4c92c | ||
|
|
d6f3ee9758 | ||
|
|
808168b9e7 | ||
|
|
120eb702a7 | ||
|
|
0d8a20c35e | ||
|
|
596e26a96f | ||
|
|
1f3780f338 | ||
|
|
85f6195a51 | ||
|
|
7e1b1779a9 | ||
|
|
ef42a49009 | ||
|
|
51e5f1e7de | ||
|
|
9cffd17e19 | ||
|
|
d95e7168aa | ||
|
|
e9f16935b6 | ||
|
|
e7488b2c89 | ||
|
|
8ac4086e71 | ||
|
|
6b5273fa1c | ||
|
|
a7c22c06af | ||
|
|
9b1e854bf7 | ||
|
|
a72d1ca1b3 | ||
|
|
926700856d | ||
|
|
be5e4458ba | ||
|
|
317cd585b2 | ||
|
|
ab93d59a77 | ||
|
|
c70d62a51e | ||
|
|
5d8db176f4 | ||
|
|
82bc2f33f2 | ||
|
|
0d5ff261fe | ||
|
|
374b35f78a | ||
|
|
f5c29edee4 | ||
|
|
8fb450a6d4 | ||
|
|
311c5d0d51 | ||
|
|
c6039f4b51 | ||
|
|
f90bd81e15 | ||
|
|
a10e547420 | ||
|
|
d0f9e57bf1 | ||
|
|
2519456c98 | ||
|
|
9371bc6d7b | ||
|
|
58e964fb8c | ||
|
|
57760528c9 | ||
|
|
385c60e993 | ||
|
|
561baf5771 | ||
|
|
f281fa7b14 | ||
|
|
58c68bade9 | ||
|
|
6ae8a72a35 | ||
|
|
eb992c7b45 | ||
|
|
0688405f86 | ||
|
|
694711b3f4 | ||
|
|
01d3f707e4 | ||
|
|
4e28856015 | ||
|
|
dd34fda42e | ||
|
|
8bb456df53 | ||
|
|
4886e2a7dc | ||
|
|
674dfebb0d | ||
|
|
e8ecc85828 | ||
|
|
04bd8cc5ce | ||
|
|
6becd73ac2 | ||
|
|
72d6e251b8 | ||
|
|
9491c9102c | ||
|
|
a728cf312d | ||
|
|
e321e27899 | ||
|
|
96e8467e13 | ||
|
|
508918a684 | ||
|
|
8adef26d18 | ||
|
|
2d45abd12b | ||
|
|
bd5e55aad9 | ||
|
|
764eddd9f8 | ||
|
|
015ff8f179 | ||
|
|
9b651c2451 | ||
|
|
bb16f4ad57 | ||
|
|
7b3023ccce | ||
|
|
e6a3a95ff9 | ||
|
|
80e413c370 | ||
|
|
69fd9048fd | ||
|
|
7254bb7a2f | ||
|
|
7a4d29d561 | ||
|
|
c54909f2a3 | ||
|
|
b57e4fce07 | ||
|
|
23af649d7f | ||
|
|
88756a443a | ||
|
|
4a78f8fb43 | ||
|
|
6c8388ea5e | ||
|
|
75520bfaf9 | ||
|
|
3a4d9e64f8 | ||
|
|
209e30f7ef | ||
|
|
052e2a1a42 | ||
|
|
b460705831 | ||
|
|
3aadccc2e8 | ||
|
|
5ae2fdee94 | ||
|
|
380512dcbe | ||
|
|
58c47f4c0a | ||
|
|
8e2a68887c | ||
|
|
eb1ecff7d8 | ||
|
|
8141723869 | ||
|
|
8cb701bda3 | ||
|
|
a8f3c3054b | ||
|
|
c5fb4227bf | ||
|
|
1b29746806 | ||
|
|
f98ad6ccab | ||
|
|
fb9c317256 | ||
|
|
0f1f2875ff | ||
|
|
a88b4ad06b | ||
|
|
f3a6b064c8 | ||
|
|
5e6fb33ed7 | ||
|
|
172fda2157 | ||
|
|
5e7137e0c4 | ||
|
|
4f0c45004a | ||
|
|
4cf5e47ec3 | ||
|
|
143a59a19d | ||
|
|
60de41e6fd | ||
|
|
cbbb4cdb8c | ||
|
|
8c5b919e72 | ||
|
|
61b247b156 | ||
|
|
47c05b75d0 | ||
|
|
2147ae9105 | ||
|
|
c1aa013053 | ||
|
|
4a99afae3b | ||
|
|
119dcf9c97 | ||
|
|
b7d14ca48e | ||
|
|
37cd12fb21 | ||
|
|
a3f9eed6e2 | ||
|
|
ffb61503dc | ||
|
|
fbda0e38e1 | ||
|
|
bfd8fb1c23 | ||
|
|
c6760371ba | ||
|
|
8c704951e1 | ||
|
|
018f7808db | ||
|
|
24c23628d6 | ||
|
|
1d3c71fd10 | ||
|
|
e8d059fa77 | ||
|
|
3b4a9dc368 | ||
|
|
244ae33ad6 | ||
|
|
21c9332a7f | ||
|
|
c1eb605195 | ||
|
|
0ee1818f12 | ||
|
|
ae6e0a08ea | ||
|
|
31758cbe2b | ||
|
|
a4a1fa4ec9 | ||
|
|
d9d2e851f4 | ||
|
|
c32e186133 | ||
|
|
3d325caa06 | ||
|
|
91c63cb12e | ||
|
|
22141aba7b | ||
|
|
9b066b3b88 | ||
|
|
7ea7f5a967 | ||
|
|
38041b25fb | ||
|
|
3adeea8172 | ||
|
|
10c3641307 | ||
|
|
af9b03cfa5 | ||
|
|
4ff354dd41 | ||
|
|
bd8c325306 | ||
|
|
9902cedc06 | ||
|
|
b64ee96636 | ||
|
|
806a2f0597 | ||
|
|
0cb9f7ab4f | ||
|
|
8c1ff2dc1c | ||
|
|
dc6c894cb8 | ||
|
|
3fa9b68882 | ||
|
|
0514f889d3 | ||
|
|
f2ab409c9c | ||
|
|
890841a818 | ||
|
|
aed71a6335 | ||
|
|
c910d35e25 | ||
|
|
0586a77043 | ||
|
|
b4b032693a | ||
|
|
054fd8798b | ||
|
|
35a7d907cd | ||
|
|
4c66cfe6e3 | ||
|
|
4360ad6502 | ||
|
|
841a2474af | ||
|
|
33b6f2cbc4 | ||
|
|
4680b6a497 | ||
|
|
db46763e13 | ||
|
|
c5727d366f | ||
|
|
7ee1af3cc8 | ||
|
|
a749a4654e | ||
|
|
3c8a71f39f | ||
|
|
ed7411294e | ||
|
|
aaecce7574 | ||
|
|
480e2a0fb5 | ||
|
|
a3a0f33ad4 | ||
|
|
089da40941 | ||
|
|
ce0d17e042 | ||
|
|
aba737ab48 | ||
|
|
a7c5d9e92a | ||
|
|
b2a377d7f1 | ||
|
|
1d65234073 | ||
|
|
38065791da | ||
|
|
086d2f0ba4 | ||
|
|
377e06d99a | ||
|
|
37cf1b2901 | ||
|
|
d9f280dc56 | ||
|
|
b207f9ea02 | ||
|
|
2690f8171e | ||
|
|
7136ac38d6 | ||
|
|
d4b5e98514 | ||
|
|
0ede0719c5 | ||
|
|
06124a0d94 | ||
|
|
d19d88e5dc | ||
|
|
b2d8b0bfe4 | ||
|
|
095ac3dfa5 | ||
|
|
a86edc69ac | ||
|
|
21bc4cdc9b | ||
|
|
b682ed7ad9 | ||
|
|
5e823d1f16 | ||
|
|
d32949d1d3 | ||
|
|
06c26c99bb | ||
|
|
22e599598a | ||
|
|
d666050e0c | ||
|
|
8018c586cd | ||
|
|
e73911c458 | ||
|
|
7e79b27823 | ||
|
|
5fa9ef05a6 | ||
|
|
f239b658e6 | ||
|
|
141c22ff67 | ||
|
|
23651ae510 | ||
|
|
45a1efe2ae | ||
|
|
06c135aab1 | ||
|
|
2203694b3f | ||
|
|
f7ab9646d0 | ||
|
|
a4959cad15 | ||
|
|
1c0a7e9bd9 | ||
|
|
cc46761e34 | ||
|
|
e1c3e7a3a6 | ||
|
|
baf85e7a80 | ||
|
|
32b371eac1 | ||
|
|
147aad9221 | ||
|
|
41e0d39a5a | ||
|
|
91496b08bd | ||
|
|
b3d20effd6 | ||
|
|
2e0b9bd6b4 | ||
|
|
e497304b9d | ||
|
|
4b3e9432df | ||
|
|
1d67d50a20 | ||
|
|
f65cadd24c | ||
|
|
f0c37bd69e | ||
|
|
21513f8df0 | ||
|
|
40551b36e5 | ||
|
|
eb73b6b2f5 | ||
|
|
504378261b | ||
|
|
a5ceddc40a | ||
|
|
0fb23c4e5b | ||
|
|
40c7559905 | ||
|
|
edda622060 | ||
|
|
c0056e75d0 | ||
|
|
f1694707ee | ||
|
|
97ec9666ed | ||
|
|
7b91e9e164 | ||
|
|
ff0f1d8ce9 | ||
|
|
1e3c425e81 | ||
|
|
b2b5aeb08b | ||
|
|
01ab3be8d3 | ||
|
|
0d7ca88cc2 | ||
|
|
4fee774fe5 | ||
|
|
e5825b5fcd | ||
|
|
0d9f348e93 | ||
|
|
1ea0018a50 | ||
|
|
d3dc59c5da | ||
|
|
3bec8fe7d2 | ||
|
|
b2e3fb6354 | ||
|
|
642a097b4b | ||
|
|
7cedc501f7 | ||
|
|
296c5bd3d2 | ||
|
|
a2bddea1e2 | ||
|
|
53cd9f8b5f | ||
|
|
b344826c44 | ||
|
|
a0dc68ab9a | ||
|
|
22f2b5d0e5 | ||
|
|
c411900efd | ||
|
|
592aa93c40 | ||
|
|
6c02dd75fa | ||
|
|
39853d4949 | ||
|
|
2404f5d00f | ||
|
|
1c615c42b6 | ||
|
|
f84746274f | ||
|
|
45ce68e16e | ||
|
|
1aef576403 | ||
|
|
c3582f0aff | ||
|
|
8c4c0ff5e1 | ||
|
|
b1f708dcad | ||
|
|
7b6334d447 | ||
|
|
bfd9be8280 | ||
|
|
96e1388dde | ||
|
|
fd64be1dcd | ||
|
|
64974a2c54 | ||
|
|
e363692822 | ||
|
|
d5d93ed147 | ||
|
|
c3547f29d0 | ||
|
|
55f202b7cb | ||
|
|
989ba7bbe7 | ||
|
|
ac90d8036f | ||
|
|
644da707d2 | ||
|
|
86b48b8980 | ||
|
|
69c8791fc5 | ||
|
|
247f1045fe | ||
|
|
8b35679fcf | ||
|
|
cb8af0a02b | ||
|
|
0b442a2e1a | ||
|
|
f98e92b255 | ||
|
|
eca1836bd8 | ||
|
|
17e8cad005 | ||
|
|
48e89dd27e | ||
|
|
e9ef48b79c | ||
|
|
42e78ad3a3 | ||
|
|
ab9df22e76 | ||
|
|
84f2ecd80f | ||
|
|
98f946c871 | ||
|
|
113826b2e7 | ||
|
|
452d97f2d0 | ||
|
|
7fe8da8590 | ||
|
|
3f0e46230f | ||
|
|
821251a53f | ||
|
|
fad3259290 | ||
|
|
5fd8678a3a | ||
|
|
86df9ac035 | ||
|
|
d4b342a35d | ||
|
|
8c87f5a384 | ||
|
|
984f676d6e | ||
|
|
5334bbb303 | ||
|
|
0f213b08a6 | ||
|
|
3f997b416f | ||
|
|
f88e231780 | ||
|
|
fff95fcebd | ||
|
|
de17664c49 | ||
|
|
2b1826d2e6 | ||
|
|
b8d8ec640d | ||
|
|
e2c01e9e5d | ||
|
|
a55efdff18 | ||
|
|
3c1af200f8 | ||
|
|
dc8f676f75 | ||
|
|
a160f2e212 | ||
|
|
012d5e7ae0 | ||
|
|
c1ce4f9a9f | ||
|
|
cceb6809e7 | ||
|
|
48b559472e | ||
|
|
cddc452693 | ||
|
|
0904a21e3f | ||
|
|
e800946898 | ||
|
|
e189034436 | ||
|
|
4590013adc | ||
|
|
66230199f8 | ||
|
|
1f1a2b660f | ||
|
|
b8b35194c9 | ||
|
|
4f36369ea1 | ||
|
|
33a906f11a | ||
|
|
82d11eeb47 | ||
|
|
fdef394070 | ||
|
|
a3a5630e88 | ||
|
|
9f7fd6a3a1 | ||
|
|
112a6f9942 | ||
|
|
60110a4302 | ||
|
|
4426e2adfe | ||
|
|
0028b3cf17 | ||
|
|
4867810ebe | ||
|
|
03f4e9f621 | ||
|
|
6b2476d220 | ||
|
|
b8bf66031b | ||
|
|
2596a150bf | ||
|
|
142d6c8993 | ||
|
|
a3309365fc | ||
|
|
9dcdb1bc8c | ||
|
|
2275daf3b0 | ||
|
|
d145cb508a | ||
|
|
7028fd21bc | ||
|
|
51adfd0254 | ||
|
|
6e2ed188eb | ||
|
|
2a3516d593 | ||
|
|
e5a60beba0 | ||
|
|
2804076bf6 | ||
|
|
f63abd9b6f | ||
|
|
4ebdc9d6ed | ||
|
|
6e364a0ab9 | ||
|
|
3233b9776f | ||
|
|
905bbf9118 | ||
|
|
d70e5dff45 | ||
|
|
c4fc0ed982 | ||
|
|
320922a13d | ||
|
|
9514977ce2 | ||
|
|
62d08dce56 | ||
|
|
71e36d264e | ||
|
|
055968bea9 | ||
|
|
7dc1672b24 | ||
|
|
d0457b73ec | ||
|
|
50e40879de | ||
|
|
7e8ff50886 | ||
|
|
6cc24e475a | ||
|
|
4232284dae | ||
|
|
6958fd0965 | ||
|
|
1f8726669b | ||
|
|
47d65931e6 | ||
|
|
bfbb046b10 | ||
|
|
36a6ee4fc9 | ||
|
|
8b256caa6c | ||
|
|
f96d28a0a8 | ||
|
|
d3b9965283 | ||
|
|
f03d731b1d | ||
|
|
291c513d3b | ||
|
|
8935de0809 | ||
|
|
db8b00e8df | ||
|
|
5d31c372fa | ||
|
|
0497122e25 | ||
|
|
645d68d5d0 | ||
|
|
f04b8368aa | ||
|
|
f9fd4f1e2a | ||
|
|
55ed552ba7 | ||
|
|
7bfa23fab7 | ||
|
|
7bd427b4e7 | ||
|
|
a9a9fb1da2 | ||
|
|
6653b13144 | ||
|
|
8bea29f0e7 | ||
|
|
d556564ee1 | ||
|
|
2286a9e2a4 | ||
|
|
30c10cb67f | ||
|
|
74a42a4d4f | ||
|
|
c31443cb79 | ||
|
|
a698aec7a5 | ||
|
|
04d2aaf05c | ||
|
|
5103f898e1 | ||
|
|
68ee3231f4 | ||
|
|
62a7850a0b | ||
|
|
20f1ec42b1 | ||
|
|
e51e55b634 | ||
|
|
bc7db973ad | ||
|
|
0489103e11 | ||
|
|
b99249d2d2 | ||
|
|
23aed5415c | ||
|
|
2adbcf5e6f | ||
|
|
6a99e3c1c9 | ||
|
|
8e1de5bf2d | ||
|
|
f6808ee522 | ||
|
|
4f650d3c5b | ||
|
|
ba641d96d5 | ||
|
|
3dc514c67d | ||
|
|
5df7c58b1b | ||
|
|
bb680ac514 | ||
|
|
e18018cacd | ||
|
|
5d91c8832b | ||
|
|
c96c8ac30d | ||
|
|
f930533d8b | ||
|
|
29bfb8a8bf | ||
|
|
f04359f398 | ||
|
|
c24052e976 | ||
|
|
5f8e43fc67 | ||
|
|
5427b146cf | ||
|
|
6f231ce800 | ||
|
|
d66d1c8739 | ||
|
|
50b4388b8d | ||
|
|
9cc8b75ffb | ||
|
|
e715342f7a | ||
|
|
c86ac4f9a7 | ||
|
|
b79fe06be4 | ||
|
|
e5764ac495 | ||
|
|
2ff7cb8956 | ||
|
|
3064ab4b25 | ||
|
|
d2f8d2e903 | ||
|
|
036c7796e5 | ||
|
|
356dd46537 | ||
|
|
bb30e1abb8 | ||
|
|
84d225e389 | ||
|
|
dcf2780cac | ||
|
|
3e421c770b | ||
|
|
19cb0e873a | ||
|
|
ed81dbc4a2 | ||
|
|
a93d5b87e1 | ||
|
|
d40a52e403 | ||
|
|
a4a3797cc1 | ||
|
|
bd29e5f13a | ||
|
|
ce13ee8a55 | ||
|
|
e5ed5fbc6a | ||
|
|
ff7eca2f08 | ||
|
|
06be217030 | ||
|
|
4880052559 | ||
|
|
147043857b | ||
|
|
1bfa1a7746 | ||
|
|
3747a6a454 | ||
|
|
f1e6246962 | ||
|
|
d2c6190b59 | ||
|
|
0f8247ce69 | ||
|
|
dae3be99ce | ||
|
|
6e625e0cc9 | ||
|
|
a602101695 | ||
|
|
48d86fdbf5 | ||
|
|
d6cfde0f94 | ||
|
|
1b9b4fdd39 | ||
|
|
8bb551eb10 | ||
|
|
6177035f84 | ||
|
|
e6d3ce5918 | ||
|
|
9e08143981 | ||
|
|
2014a48d22 | ||
|
|
b7e1202cf1 | ||
|
|
44b994414d | ||
|
|
a7265c2493 | ||
|
|
261ec270c5 | ||
|
|
356be511a8 | ||
|
|
f896e72013 | ||
|
|
187a895265 | ||
|
|
6224f8ca51 | ||
|
|
3b27e6e466 | ||
|
|
4e53deec9d | ||
|
|
2cafa78339 | ||
|
|
f3f86017b6 | ||
|
|
5479080eb2 | ||
|
|
3cb3e8a7f9 | ||
|
|
6a907f1fed | ||
|
|
241f845c08 | ||
|
|
623f63abb3 | ||
|
|
293adc3a99 | ||
|
|
dee9f90a0b | ||
|
|
a7348f0eb9 | ||
|
|
7457735c04 | ||
|
|
0f389b2a48 | ||
|
|
bfe01899a4 | ||
|
|
9531762c44 | ||
|
|
e59a35e804 | ||
|
|
21f5f5fe5e | ||
|
|
e6483fed98 | ||
|
|
98bc04697e | ||
|
|
38e9b59b89 | ||
|
|
118b22fe56 | ||
|
|
8062694331 | ||
|
|
e576235307 | ||
|
|
e87502e7bf | ||
|
|
400ed9e999 | ||
|
|
5b01ad23c4 | ||
|
|
9a06fa4704 | ||
|
|
c5555ad365 | ||
|
|
9c6db1d730 | ||
|
|
30cfe69e26 | ||
|
|
e45049a602 | ||
|
|
82129ff3bd | ||
|
|
593b603295 | ||
|
|
54b2e41afd | ||
|
|
ede6e6dd87 | ||
|
|
e18ea88735 | ||
|
|
750dfe746e | ||
|
|
53404f1002 | ||
|
|
5623784c59 | ||
|
|
d122de04e4 | ||
|
|
2fa9774955 |
@@ -79,6 +79,8 @@ Then, **for a method** of an eligible class:
|
||||
|
||||
## Installation
|
||||
|
||||
Note : PHP7 is required. Migrating to PHP8 requires some additional work which is questionable as an alternative way to generate a documentation is being considered.
|
||||
|
||||
```
|
||||
cd .doc
|
||||
composer require phpdocumentor/phpdocumentor:~2 --dev
|
||||
|
||||
@@ -79,6 +79,20 @@ gitGraph
|
||||
commit id: "2023-08-10" tag: "2.7.9"
|
||||
checkout support/3.1
|
||||
commit id: "2023-12-20" tag: "3.1.1"
|
||||
checkout develop
|
||||
commit id: "2024-01-15" tag: "Start 3.2" type: HIGHLIGHT
|
||||
branch support/3.2 order: 830
|
||||
checkout support/2.7
|
||||
commit id: "2024-01-17a" tag: "2.7.10"
|
||||
checkout support/3.0
|
||||
commit id: "2024-01-17b" tag: "3.0.4"
|
||||
checkout support/2.7
|
||||
commit id: "2024-09-28" tag: "2.7.11"
|
||||
checkout support/3.1
|
||||
commit id: "2024-09-27" tag: "3.1.2"
|
||||
checkout support/3.2
|
||||
commit id: "2024-06-25" tag: "3.2.0-beta1" type: REVERSE
|
||||
commit id: "2024-08-07" tag: "3.2.0"
|
||||
```
|
||||
|
||||
To learn more, check the [iTop community versions history on the official wiki](https://www.itophub.io/wiki/page?id=latest:release:start).
|
||||
|
||||
43
.github/workflows/action.yml
vendored
Normal file
43
.github/workflows/action.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
name: Add PRs to Combodo PRs Dashboard
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
types:
|
||||
- opened
|
||||
|
||||
jobs:
|
||||
add-to-project:
|
||||
name: Add PR to Combodo Project
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Check if author is a member of the organization
|
||||
id: check-membership
|
||||
run: |
|
||||
ORG="Combodo"
|
||||
AUTHOR=$(jq -r .pull_request.user.login "$GITHUB_EVENT_PATH")
|
||||
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: token ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}" \
|
||||
"https://api.github.com/orgs/$ORG/members/$AUTHOR")
|
||||
if [ "$RESPONSE" == "404" ]; then
|
||||
echo "project_url=https://github.com/orgs/Combodo/projects/5" >> $GITHUB_ENV
|
||||
echo "is_member=false" >> $GITHUB_ENV
|
||||
else
|
||||
echo "project_url=https://github.com/orgs/Combodo/projects/4" >> $GITHUB_ENV
|
||||
echo "is_member=true" >> $GITHUB_ENV
|
||||
|
||||
fi
|
||||
|
||||
- name: Add internal tag if member
|
||||
if: env.is_member == 'true'
|
||||
run: |
|
||||
curl -X POST -H "Authorization: token ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
https://api.github.com/repos/Combodo/iTop/issues/${{ github.event.pull_request.number }}/labels \
|
||||
-d '{"labels":["internal"]}'
|
||||
env:
|
||||
is_member: ${{ env.is_member }}
|
||||
|
||||
- name: Add PR to the appropriate project
|
||||
uses: actions/add-to-project@v1.0.2
|
||||
with:
|
||||
project-url: ${{ env.project_url }}
|
||||
github-token: ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}
|
||||
@@ -53,12 +53,12 @@ switch ($sDependenciesHandlerCode) {
|
||||
|
||||
// Start handler
|
||||
$oDependenciesHandler = new $sDependenciesHandlerFQCN();
|
||||
$aDeniedButStillPresent = $oDependenciesHandler->ListDeniedButStillPresentFoldersAbsPaths();
|
||||
$aDeniedButStillPresent = $oDependenciesHandler->ListDeniedButStillPresentFilesAbsPaths();
|
||||
|
||||
echo "\n";
|
||||
foreach ($aDeniedButStillPresent as $sDir)
|
||||
{
|
||||
if (false === $oDependenciesHandler::IsQuestionnableFolder($sDir))
|
||||
if (false === $oDependenciesHandler::IsQuestionnableFile($sDir))
|
||||
{
|
||||
echo "ERROR found INVALID denied test dir: '$sDir'\n";
|
||||
throw new \RuntimeException("$sDir is in the denied list but doesn't comply with the rule (see IsQuestionnableFolder method)");
|
||||
@@ -70,7 +70,12 @@ foreach ($aDeniedButStillPresent as $sDir)
|
||||
}
|
||||
|
||||
try {
|
||||
SetupUtils::rrmdir($sDir);
|
||||
if(is_dir($sDir)){
|
||||
SetupUtils::rrmdir($sDir);
|
||||
}
|
||||
else{
|
||||
unlink($sDir);
|
||||
}
|
||||
echo "✔️ Remove denied test dir: '$sDir'\n";
|
||||
}
|
||||
catch (\Exception $e) {
|
||||
@@ -80,10 +85,10 @@ foreach ($aDeniedButStillPresent as $sDir)
|
||||
|
||||
|
||||
$aAllowedAndDeniedDirs = array_merge(
|
||||
$oDependenciesHandler->ListAllowedFoldersAbsPaths(),
|
||||
$oDependenciesHandler->ListDeniedFoldersAbsPaths()
|
||||
$oDependenciesHandler->ListAllowedFilesAbsPaths(),
|
||||
$oDependenciesHandler->ListDeniedFilesAbsPaths()
|
||||
);
|
||||
$aExistingDirs = $oDependenciesHandler->ListAllFoldersAbsPaths();
|
||||
$aExistingDirs = $oDependenciesHandler->ListAllFilesAbsPaths();
|
||||
$aMissing = array_diff($aExistingDirs, $aAllowedAndDeniedDirs);
|
||||
if (false === empty($aMissing)) {
|
||||
echo "Some new tests dirs exists !\n"
|
||||
|
||||
@@ -25,12 +25,34 @@
|
||||
|
||||
|
||||
if (count($argv) === 1) {
|
||||
echo '⚠ You must pass the base tag/sha1 as parameter';
|
||||
echo "⚠ You must pass the base tag/sha1 as parameter\n";
|
||||
exit(1);
|
||||
}
|
||||
$sBaseReference = $argv[1];
|
||||
|
||||
|
||||
/**
|
||||
* Replace the Github emojis codes by their UTF-8 character equivalent
|
||||
*/
|
||||
function ReplaceGitmojis(string $sLine)
|
||||
{
|
||||
static $aGitmojis = null;
|
||||
|
||||
if ($aGitmojis === null) {
|
||||
$aRawGitmojis = json_decode(trim(file_get_contents(__DIR__.'/gitmojis.json')), true);
|
||||
if ($aRawGitmojis === false) {
|
||||
echo "\nFailed to parse ".__DIR__."/gitmojis.json, emoji codes will not be replaced by their unicode equivalent.\n";
|
||||
} else {
|
||||
foreach($aRawGitmojis["gitmojis"] as $aGitmoji) {
|
||||
$aGitmojis[$aGitmoji['code']] = $aGitmoji['emoji'];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (is_array($aGitmojis)) {
|
||||
return str_replace(array_keys($aGitmojis), array_values($aGitmojis), $sLine);
|
||||
}
|
||||
}
|
||||
|
||||
//--- Get log
|
||||
$sGitLogCommand = 'git log --decorate --pretty="%h;%s" --date-order --no-merges '.$sBaseReference.'..HEAD';
|
||||
$sGitLogRaw = shell_exec($sGitLogCommand);
|
||||
@@ -73,5 +95,5 @@ echo "\n";
|
||||
echo "# Logs line without bug referenced\n";
|
||||
echo "sha1;subject\n";
|
||||
foreach ($aLogLineNoBug as $sLogLine) {
|
||||
echo "$sLogLine\n";
|
||||
}
|
||||
echo ReplaceGitmojis($sLogLine)."\n";
|
||||
}
|
||||
|
||||
589
.make/release/gitmojis.json
Normal file
589
.make/release/gitmojis.json
Normal file
@@ -0,0 +1,589 @@
|
||||
{
|
||||
"$schema": "https://gitmoji.dev/api/gitmojis/schema",
|
||||
"gitmojis": [
|
||||
{
|
||||
"emoji": "🎨",
|
||||
"entity": "🎨",
|
||||
"code": ":art:",
|
||||
"description": "Improve structure / format of the code.",
|
||||
"name": "art",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "⚡️",
|
||||
"entity": "⚡",
|
||||
"code": ":zap:",
|
||||
"description": "Improve performance.",
|
||||
"name": "zap",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🔥",
|
||||
"entity": "🔥",
|
||||
"code": ":fire:",
|
||||
"description": "Remove code or files.",
|
||||
"name": "fire",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🐛",
|
||||
"entity": "🐛",
|
||||
"code": ":bug:",
|
||||
"description": "Fix a bug.",
|
||||
"name": "bug",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🚑️",
|
||||
"entity": "🚑",
|
||||
"code": ":ambulance:",
|
||||
"description": "Critical hotfix.",
|
||||
"name": "ambulance",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "✨",
|
||||
"entity": "✨",
|
||||
"code": ":sparkles:",
|
||||
"description": "Introduce new features.",
|
||||
"name": "sparkles",
|
||||
"semver": "minor"
|
||||
},
|
||||
{
|
||||
"emoji": "📝",
|
||||
"entity": "📝",
|
||||
"code": ":memo:",
|
||||
"description": "Add or update documentation.",
|
||||
"name": "memo",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🚀",
|
||||
"entity": "🚀",
|
||||
"code": ":rocket:",
|
||||
"description": "Deploy stuff.",
|
||||
"name": "rocket",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "💄",
|
||||
"entity": "&#ff99cc;",
|
||||
"code": ":lipstick:",
|
||||
"description": "Add or update the UI and style files.",
|
||||
"name": "lipstick",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🎉",
|
||||
"entity": "🎉",
|
||||
"code": ":tada:",
|
||||
"description": "Begin a project.",
|
||||
"name": "tada",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "✅",
|
||||
"entity": "✅",
|
||||
"code": ":white_check_mark:",
|
||||
"description": "Add, update, or pass tests.",
|
||||
"name": "white-check-mark",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🔒️",
|
||||
"entity": "🔒",
|
||||
"code": ":lock:",
|
||||
"description": "Fix security or privacy issues.",
|
||||
"name": "lock",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🔐",
|
||||
"entity": "🔐",
|
||||
"code": ":closed_lock_with_key:",
|
||||
"description": "Add or update secrets.",
|
||||
"name": "closed-lock-with-key",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🔖",
|
||||
"entity": "🔖",
|
||||
"code": ":bookmark:",
|
||||
"description": "Release / Version tags.",
|
||||
"name": "bookmark",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🚨",
|
||||
"entity": "🚨",
|
||||
"code": ":rotating_light:",
|
||||
"description": "Fix compiler / linter warnings.",
|
||||
"name": "rotating-light",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🚧",
|
||||
"entity": "🚧",
|
||||
"code": ":construction:",
|
||||
"description": "Work in progress.",
|
||||
"name": "construction",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "💚",
|
||||
"entity": "💚",
|
||||
"code": ":green_heart:",
|
||||
"description": "Fix CI Build.",
|
||||
"name": "green-heart",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "⬇️",
|
||||
"entity": "⬇️",
|
||||
"code": ":arrow_down:",
|
||||
"description": "Downgrade dependencies.",
|
||||
"name": "arrow-down",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "⬆️",
|
||||
"entity": "⬆️",
|
||||
"code": ":arrow_up:",
|
||||
"description": "Upgrade dependencies.",
|
||||
"name": "arrow-up",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "📌",
|
||||
"entity": "📌",
|
||||
"code": ":pushpin:",
|
||||
"description": "Pin dependencies to specific versions.",
|
||||
"name": "pushpin",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "👷",
|
||||
"entity": "👷",
|
||||
"code": ":construction_worker:",
|
||||
"description": "Add or update CI build system.",
|
||||
"name": "construction-worker",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "📈",
|
||||
"entity": "📈",
|
||||
"code": ":chart_with_upwards_trend:",
|
||||
"description": "Add or update analytics or track code.",
|
||||
"name": "chart-with-upwards-trend",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "♻️",
|
||||
"entity": "♻",
|
||||
"code": ":recycle:",
|
||||
"description": "Refactor code.",
|
||||
"name": "recycle",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "➕",
|
||||
"entity": "➕",
|
||||
"code": ":heavy_plus_sign:",
|
||||
"description": "Add a dependency.",
|
||||
"name": "heavy-plus-sign",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "➖",
|
||||
"entity": "➖",
|
||||
"code": ":heavy_minus_sign:",
|
||||
"description": "Remove a dependency.",
|
||||
"name": "heavy-minus-sign",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🔧",
|
||||
"entity": "🔧",
|
||||
"code": ":wrench:",
|
||||
"description": "Add or update configuration files.",
|
||||
"name": "wrench",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🔨",
|
||||
"entity": "🔨",
|
||||
"code": ":hammer:",
|
||||
"description": "Add or update development scripts.",
|
||||
"name": "hammer",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🌐",
|
||||
"entity": "🌐",
|
||||
"code": ":globe_with_meridians:",
|
||||
"description": "Internationalization and localization.",
|
||||
"name": "globe-with-meridians",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "✏️",
|
||||
"entity": "",
|
||||
"code": ":pencil2:",
|
||||
"description": "Fix typos.",
|
||||
"name": "pencil2",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "💩",
|
||||
"entity": "",
|
||||
"code": ":poop:",
|
||||
"description": "Write bad code that needs to be improved.",
|
||||
"name": "poop",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "⏪️",
|
||||
"entity": "⏪",
|
||||
"code": ":rewind:",
|
||||
"description": "Revert changes.",
|
||||
"name": "rewind",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🔀",
|
||||
"entity": "🔀",
|
||||
"code": ":twisted_rightwards_arrows:",
|
||||
"description": "Merge branches.",
|
||||
"name": "twisted-rightwards-arrows",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "📦️",
|
||||
"entity": "F4E6;",
|
||||
"code": ":package:",
|
||||
"description": "Add or update compiled files or packages.",
|
||||
"name": "package",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "👽️",
|
||||
"entity": "F47D;",
|
||||
"code": ":alien:",
|
||||
"description": "Update code due to external API changes.",
|
||||
"name": "alien",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🚚",
|
||||
"entity": "F69A;",
|
||||
"code": ":truck:",
|
||||
"description": "Move or rename resources (e.g.: files, paths, routes).",
|
||||
"name": "truck",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "📄",
|
||||
"entity": "F4C4;",
|
||||
"code": ":page_facing_up:",
|
||||
"description": "Add or update license.",
|
||||
"name": "page-facing-up",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "💥",
|
||||
"entity": "💥",
|
||||
"code": ":boom:",
|
||||
"description": "Introduce breaking changes.",
|
||||
"name": "boom",
|
||||
"semver": "major"
|
||||
},
|
||||
{
|
||||
"emoji": "🍱",
|
||||
"entity": "F371",
|
||||
"code": ":bento:",
|
||||
"description": "Add or update assets.",
|
||||
"name": "bento",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "♿️",
|
||||
"entity": "♿",
|
||||
"code": ":wheelchair:",
|
||||
"description": "Improve accessibility.",
|
||||
"name": "wheelchair",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "💡",
|
||||
"entity": "💡",
|
||||
"code": ":bulb:",
|
||||
"description": "Add or update comments in source code.",
|
||||
"name": "bulb",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🍻",
|
||||
"entity": "🍻",
|
||||
"code": ":beers:",
|
||||
"description": "Write code drunkenly.",
|
||||
"name": "beers",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "💬",
|
||||
"entity": "💬",
|
||||
"code": ":speech_balloon:",
|
||||
"description": "Add or update text and literals.",
|
||||
"name": "speech-balloon",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🗃️",
|
||||
"entity": "🗃",
|
||||
"code": ":card_file_box:",
|
||||
"description": "Perform database related changes.",
|
||||
"name": "card-file-box",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🔊",
|
||||
"entity": "🔊",
|
||||
"code": ":loud_sound:",
|
||||
"description": "Add or update logs.",
|
||||
"name": "loud-sound",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🔇",
|
||||
"entity": "🔇",
|
||||
"code": ":mute:",
|
||||
"description": "Remove logs.",
|
||||
"name": "mute",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "👥",
|
||||
"entity": "👥",
|
||||
"code": ":busts_in_silhouette:",
|
||||
"description": "Add or update contributor(s).",
|
||||
"name": "busts-in-silhouette",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🚸",
|
||||
"entity": "🚸",
|
||||
"code": ":children_crossing:",
|
||||
"description": "Improve user experience / usability.",
|
||||
"name": "children-crossing",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🏗️",
|
||||
"entity": "f3d7;",
|
||||
"code": ":building_construction:",
|
||||
"description": "Make architectural changes.",
|
||||
"name": "building-construction",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "📱",
|
||||
"entity": "📱",
|
||||
"code": ":iphone:",
|
||||
"description": "Work on responsive design.",
|
||||
"name": "iphone",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🤡",
|
||||
"entity": "🤡",
|
||||
"code": ":clown_face:",
|
||||
"description": "Mock things.",
|
||||
"name": "clown-face",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🥚",
|
||||
"entity": "🥚",
|
||||
"code": ":egg:",
|
||||
"description": "Add or update an easter egg.",
|
||||
"name": "egg",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🙈",
|
||||
"entity": "bdfe7;",
|
||||
"code": ":see_no_evil:",
|
||||
"description": "Add or update a .gitignore file.",
|
||||
"name": "see-no-evil",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "📸",
|
||||
"entity": "📸",
|
||||
"code": ":camera_flash:",
|
||||
"description": "Add or update snapshots.",
|
||||
"name": "camera-flash",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "⚗️",
|
||||
"entity": "⚗",
|
||||
"code": ":alembic:",
|
||||
"description": "Perform experiments.",
|
||||
"name": "alembic",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🔍️",
|
||||
"entity": "🔍",
|
||||
"code": ":mag:",
|
||||
"description": "Improve SEO.",
|
||||
"name": "mag",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🏷️",
|
||||
"entity": "🏷",
|
||||
"code": ":label:",
|
||||
"description": "Add or update types.",
|
||||
"name": "label",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🌱",
|
||||
"entity": "🌱",
|
||||
"code": ":seedling:",
|
||||
"description": "Add or update seed files.",
|
||||
"name": "seedling",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🚩",
|
||||
"entity": "🚩",
|
||||
"code": ":triangular_flag_on_post:",
|
||||
"description": "Add, update, or remove feature flags.",
|
||||
"name": "triangular-flag-on-post",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🥅",
|
||||
"entity": "🥅",
|
||||
"code": ":goal_net:",
|
||||
"description": "Catch errors.",
|
||||
"name": "goal-net",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "💫",
|
||||
"entity": "💫",
|
||||
"code": ":dizzy:",
|
||||
"description": "Add or update animations and transitions.",
|
||||
"name": "dizzy",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🗑️",
|
||||
"entity": "🗑",
|
||||
"code": ":wastebasket:",
|
||||
"description": "Deprecate code that needs to be cleaned up.",
|
||||
"name": "wastebasket",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🛂",
|
||||
"entity": "🛂",
|
||||
"code": ":passport_control:",
|
||||
"description": "Work on code related to authorization, roles and permissions.",
|
||||
"name": "passport-control",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🩹",
|
||||
"entity": "🩹",
|
||||
"code": ":adhesive_bandage:",
|
||||
"description": "Simple fix for a non-critical issue.",
|
||||
"name": "adhesive-bandage",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🧐",
|
||||
"entity": "🧐",
|
||||
"code": ":monocle_face:",
|
||||
"description": "Data exploration/inspection.",
|
||||
"name": "monocle-face",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "⚰️",
|
||||
"entity": "⚰",
|
||||
"code": ":coffin:",
|
||||
"description": "Remove dead code.",
|
||||
"name": "coffin",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🧪",
|
||||
"entity": "🧪",
|
||||
"code": ":test_tube:",
|
||||
"description": "Add a failing test.",
|
||||
"name": "test-tube",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "👔",
|
||||
"entity": "👔",
|
||||
"code": ":necktie:",
|
||||
"description": "Add or update business logic.",
|
||||
"name": "necktie",
|
||||
"semver": "patch"
|
||||
},
|
||||
{
|
||||
"emoji": "🩺",
|
||||
"entity": "🩺",
|
||||
"code": ":stethoscope:",
|
||||
"description": "Add or update healthcheck.",
|
||||
"name": "stethoscope",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🧱",
|
||||
"entity": "🧱",
|
||||
"code": ":bricks:",
|
||||
"description": "Infrastructure related changes.",
|
||||
"name": "bricks",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🧑💻",
|
||||
"entity": "🧑‍💻",
|
||||
"code": ":technologist:",
|
||||
"description": "Improve developer experience.",
|
||||
"name": "technologist",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "💸",
|
||||
"entity": "💸",
|
||||
"code": ":money_with_wings:",
|
||||
"description": "Add sponsorships or money related infrastructure.",
|
||||
"name": "money-with-wings",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🧵",
|
||||
"entity": "🧵",
|
||||
"code": ":thread:",
|
||||
"description": "Add or update code related to multithreading or concurrency.",
|
||||
"name": "thread",
|
||||
"semver": null
|
||||
},
|
||||
{
|
||||
"emoji": "🦺",
|
||||
"entity": "🦺",
|
||||
"code": ":safety_vest:",
|
||||
"description": "Add or update code related to validation.",
|
||||
"name": "safety-vest",
|
||||
"semver": null
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -90,6 +90,7 @@ We would like to give a special thank you 🤗 to the people from the community
|
||||
- Dejin, Bie (a.k.a [@bdejin](https://github.com/bdejin))
|
||||
- Dvořák, Lukáš
|
||||
- Goethals, Stefan
|
||||
- Giuva, Vincenzo Katriel (a.k.a [@DarkNight97boss](https://github.com/DarkNight97boss))
|
||||
- Gumble, David
|
||||
- Ji, Leeb (冀利斌) (a.k.a [@chileeb](https://github.com/chileeb))
|
||||
- Kaltefleiter, Lars (a.k.a [@larhip](https://www.github.com/larhip))
|
||||
|
||||
@@ -1,331 +0,0 @@
|
||||
<?php
|
||||
namespace Html2Text;
|
||||
|
||||
if (!function_exists('mb_split'))
|
||||
{
|
||||
function mb_split($pattern, $subject, $limit = -1)
|
||||
{
|
||||
return preg_split('/'.$pattern.'/', $subject, $limit);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Replace all occurrences of the search string with the replacement string.
|
||||
*
|
||||
* @author Sean Murphy <sean@iamseanmurphy.com>
|
||||
* @copyright Copyright 2012 Sean Murphy. All rights reserved.
|
||||
* @license http://creativecommons.org/publicdomain/zero/1.0/
|
||||
* @link http://php.net/manual/function.str-replace.php
|
||||
*
|
||||
* @param mixed $search
|
||||
* @param mixed $replace
|
||||
* @param mixed $subject
|
||||
* @param int $count
|
||||
* @return mixed
|
||||
*/
|
||||
function mb_str_replace($search, $replace, $subject, &$count = 0) {
|
||||
if (!is_array($subject)) {
|
||||
// Normalize $search and $replace so they are both arrays of the same length
|
||||
$searches = is_array($search) ? array_values($search) : array($search);
|
||||
$replacements = is_array($replace) ? array_values($replace) : array($replace);
|
||||
$replacements = array_pad($replacements, count($searches), '');
|
||||
foreach ($searches as $key => $search) {
|
||||
$parts = mb_split(preg_quote($search), $subject);
|
||||
if (is_array($parts))
|
||||
{
|
||||
$count += count($parts) - 1;
|
||||
$subject = implode($replacements[$key], $parts);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Call mb_str_replace for each subject in array, recursively
|
||||
foreach ($subject as $key => $value) {
|
||||
$subject[$key] = mb_str_replace($search, $replace, $value, $count);
|
||||
}
|
||||
}
|
||||
return $subject;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Copyright (c) 2010 Jevon Wright and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* or
|
||||
*
|
||||
* LGPL which is available at http://www.gnu.org/licenses/lgpl.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* Jevon Wright - initial API and implementation
|
||||
* Denis Flaven - some fixes for properly handling UTF-8 characters
|
||||
****************************************************************************/
|
||||
|
||||
class Html2Text {
|
||||
|
||||
/**
|
||||
* Tries to convert the given HTML into a plain text format - best suited for
|
||||
* e-mail display, etc.
|
||||
*
|
||||
* <p>In particular, it tries to maintain the following features:
|
||||
* <ul>
|
||||
* <li>Links are maintained, with the 'href' copied over
|
||||
* <li>Information in the <head> is lost
|
||||
* </ul>
|
||||
*
|
||||
* @param string html the input HTML
|
||||
* @return string the HTML converted, as best as possible, to text
|
||||
* @throws Html2TextException if the HTML could not be loaded as a {@link DOMDocument}
|
||||
*/
|
||||
static function convert($html) {
|
||||
// replace with spaces
|
||||
|
||||
$html = str_replace(" ", " ", $html);
|
||||
$html = mb_str_replace("\xc2\xa0", " ", $html); // DO NOT USE str_replace since it breaks the "à" character which is \xc3 \xa0 in UTF-8
|
||||
|
||||
$html = static::fixNewlines($html);
|
||||
|
||||
$doc = new \DOMDocument();
|
||||
if (!@$doc->loadHTML('<?xml encoding="UTF-8">'.$html)) // Forces the UTF-8 character set for HTML fragments
|
||||
{
|
||||
throw new Html2TextException("Could not load HTML - badly formed?", $html);
|
||||
}
|
||||
|
||||
$output = static::iterateOverNode($doc);
|
||||
|
||||
// remove leading and trailing spaces on each line
|
||||
$output = preg_replace("/[ \t]*\n[ \t]*/im", "\n", $output);
|
||||
$output = preg_replace("/ *\t */im", "\t", $output);
|
||||
|
||||
// remove unnecessary empty lines
|
||||
$output = preg_replace("/\n\n\n*/im", "\n\n", $output);
|
||||
|
||||
// remove leading and trailing whitespace
|
||||
$output = trim($output);
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unify newlines; in particular, \r\n becomes \n, and
|
||||
* then \r becomes \n. This means that all newlines (Unix, Windows, Mac)
|
||||
* all become \ns.
|
||||
*
|
||||
* @param string text text with any number of \r, \r\n and \n combinations
|
||||
* @return string the fixed text
|
||||
*/
|
||||
static function fixNewlines($text) {
|
||||
// replace \r\n to \n
|
||||
$text = str_replace("\r\n", "\n", $text);
|
||||
// remove \rs
|
||||
$text = str_replace("\r", "\n", $text);
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
static function nextChildName($node) {
|
||||
// get the next child
|
||||
$nextNode = $node->nextSibling;
|
||||
while ($nextNode != null) {
|
||||
if ($nextNode instanceof \DOMElement) {
|
||||
break;
|
||||
}
|
||||
$nextNode = $nextNode->nextSibling;
|
||||
}
|
||||
$nextName = null;
|
||||
if ($nextNode instanceof \DOMElement && $nextNode != null) {
|
||||
$nextName = strtolower($nextNode->nodeName);
|
||||
}
|
||||
|
||||
return $nextName;
|
||||
}
|
||||
|
||||
static function prevChildName($node) {
|
||||
// get the previous child
|
||||
$nextNode = $node->previousSibling;
|
||||
while ($nextNode != null) {
|
||||
if ($nextNode instanceof \DOMElement) {
|
||||
break;
|
||||
}
|
||||
$nextNode = $nextNode->previousSibling;
|
||||
}
|
||||
$nextName = null;
|
||||
if ($nextNode instanceof \DOMElement && $nextNode != null) {
|
||||
$nextName = strtolower($nextNode->nodeName);
|
||||
}
|
||||
|
||||
return $nextName;
|
||||
}
|
||||
|
||||
static function iterateOverNode($node) {
|
||||
if ($node instanceof \DOMText) {
|
||||
// Replace whitespace characters with a space (equivilant to \s)
|
||||
return preg_replace("/[\\t\\n\\f\\r ]+/im", " ", $node->wholeText);
|
||||
}
|
||||
if ($node instanceof \DOMDocumentType) {
|
||||
// ignore
|
||||
return "";
|
||||
}
|
||||
|
||||
$nextName = static::nextChildName($node);
|
||||
$prevName = static::prevChildName($node);
|
||||
|
||||
$name = strtolower($node->nodeName);
|
||||
|
||||
// start whitespace
|
||||
switch ($name) {
|
||||
case "hr":
|
||||
return "---------------------------------------------------------------\n";
|
||||
|
||||
case "style":
|
||||
case "head":
|
||||
case "title":
|
||||
case "meta":
|
||||
case "script":
|
||||
// ignore these tags
|
||||
return "";
|
||||
|
||||
case "h1":
|
||||
case "h2":
|
||||
case "h3":
|
||||
case "h4":
|
||||
case "h5":
|
||||
case "h6":
|
||||
case "ol":
|
||||
case "ul":
|
||||
// add two newlines, second line is added below
|
||||
$output = "\n";
|
||||
break;
|
||||
|
||||
case "td":
|
||||
case "th":
|
||||
// add tab char to separate table fields
|
||||
$output = "\t";
|
||||
break;
|
||||
|
||||
case "tr":
|
||||
case "p":
|
||||
case "div":
|
||||
// add one line
|
||||
$output = "\n";
|
||||
break;
|
||||
|
||||
case "li":
|
||||
$output = "- ";
|
||||
break;
|
||||
|
||||
default:
|
||||
// print out contents of unknown tags
|
||||
$output = "";
|
||||
break;
|
||||
}
|
||||
|
||||
// debug
|
||||
//$output .= "[$name,$nextName]";
|
||||
|
||||
if (isset($node->childNodes)) {
|
||||
for ($i = 0; $i < $node->childNodes->length; $i++) {
|
||||
$n = $node->childNodes->item($i);
|
||||
|
||||
$text = static::iterateOverNode($n);
|
||||
|
||||
$output .= $text;
|
||||
}
|
||||
}
|
||||
|
||||
// end whitespace
|
||||
switch ($name) {
|
||||
case "h1":
|
||||
case "h2":
|
||||
case "h3":
|
||||
case "h4":
|
||||
case "h5":
|
||||
case "h6":
|
||||
$output .= "\n";
|
||||
break;
|
||||
|
||||
case "p":
|
||||
case "br":
|
||||
// add one line
|
||||
if ($nextName != "div")
|
||||
$output .= "\n";
|
||||
break;
|
||||
|
||||
case "div":
|
||||
// add one line only if the next child isn't a div
|
||||
if ($nextName != "div" && $nextName != null)
|
||||
$output .= "\n";
|
||||
break;
|
||||
|
||||
case "a":
|
||||
// links are returned in [text](link) format
|
||||
$href = $node->getAttribute("href");
|
||||
|
||||
$output = trim($output);
|
||||
|
||||
// remove double [[ ]] s from linking images
|
||||
if (substr($output, 0, 1) == "[" && substr($output, -1) == "]") {
|
||||
$output = substr($output, 1, strlen($output) - 2);
|
||||
|
||||
// for linking images, the title of the <a> overrides the title of the <img>
|
||||
if ($node->getAttribute("title")) {
|
||||
$output = $node->getAttribute("title");
|
||||
}
|
||||
}
|
||||
|
||||
// if there is no link text, but a title attr
|
||||
if (!$output && $node->getAttribute("title")) {
|
||||
$output = $node->getAttribute("title");
|
||||
}
|
||||
|
||||
if ($href == null) {
|
||||
// it doesn't link anywhere
|
||||
if ($node->getAttribute("name") != null) {
|
||||
$output = "[$output]";
|
||||
}
|
||||
} else {
|
||||
if ($href == $output || $href == "mailto:$output" || $href == "http://$output" || $href == "https://$output") {
|
||||
// link to the same address: just use link
|
||||
$output;
|
||||
} else {
|
||||
// replace it
|
||||
if ($output) {
|
||||
$output = "[$output]($href)";
|
||||
} else {
|
||||
// empty string
|
||||
$output = $href;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// does the next node require additional whitespace?
|
||||
switch ($nextName) {
|
||||
case "h1": case "h2": case "h3": case "h4": case "h5": case "h6":
|
||||
$output .= "\n";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case "img":
|
||||
if ($node->getAttribute("title")) {
|
||||
$output = "[" . $node->getAttribute("title") . "]";
|
||||
} elseif ($node->getAttribute("alt")) {
|
||||
$output = "[" . $node->getAttribute("alt") . "]";
|
||||
} else {
|
||||
$output = "";
|
||||
}
|
||||
break;
|
||||
|
||||
case "li":
|
||||
$output .= "\n";
|
||||
break;
|
||||
|
||||
default:
|
||||
// do nothing
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
<?php
|
||||
|
||||
/******************************************************************************
|
||||
* Copyright (c) 2010 Jevon Wright and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* or
|
||||
*
|
||||
* LGPL which is available at http://www.gnu.org/licenses/lgpl.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* Jevon Wright - initial API and implementation
|
||||
****************************************************************************/
|
||||
|
||||
namespace Html2Text;
|
||||
|
||||
class Html2TextException extends \Exception {
|
||||
var $more_info;
|
||||
|
||||
public function __construct($message = "", $more_info = "") {
|
||||
parent::__construct($message);
|
||||
$this->more_info = $more_info;
|
||||
}
|
||||
}
|
||||
@@ -64,13 +64,13 @@ interface iLoginFSMExtension extends iLoginExtension
|
||||
* If a page is displayed, the action must exit at this point
|
||||
* if LoginWebPage::LOGIN_FSM_RETURN_ERROR is returned $iErrorCode must be set
|
||||
* if LoginWebPage::LOGIN_FSM_RETURN_OK is returned then the login is OK and terminated
|
||||
* if LoginWebPage::LOGIN_FSM_RETURN_IGNORE is returned then the FSM will proceed to next plugin or state
|
||||
* if LoginWebPage::LOGIN_FSM_CONTINUE is returned then the FSM will proceed to next plugin or state
|
||||
*
|
||||
* @api
|
||||
* @param string $sLoginState (see LoginWebPage::LOGIN_STATE_...)
|
||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||
*
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||
*/
|
||||
public function LoginAction($sLoginState, &$iErrorCode);
|
||||
}
|
||||
@@ -83,7 +83,7 @@ interface iLoginFSMExtension extends iLoginExtension
|
||||
* * If a page is displayed, the action must exit at this point
|
||||
* * if LoginWebPage::LOGIN_FSM_RETURN_ERROR is returned $iErrorCode must be set
|
||||
* * if LoginWebPage::LOGIN_FSM_RETURN_OK is returned then the login is OK and terminated
|
||||
* * if LoginWebPage::LOGIN_FSM_RETURN_IGNORE is returned then the FSM will proceed to next plugin or to next state
|
||||
* * if LoginWebPage::LOGIN_FSM_CONTINUE is returned then the FSM will proceed to next plugin or to next state
|
||||
*
|
||||
* @api
|
||||
* @package LoginExtensibilityAPI
|
||||
@@ -136,7 +136,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
|
||||
* @api
|
||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||
*
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||
*/
|
||||
protected function OnStart(&$iErrorCode)
|
||||
{
|
||||
@@ -150,7 +150,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
|
||||
* @api
|
||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||
*
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||
*/
|
||||
protected function OnModeDetection(&$iErrorCode)
|
||||
{
|
||||
@@ -167,7 +167,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
|
||||
* @api
|
||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||
*
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||
*/
|
||||
protected function OnReadCredentials(&$iErrorCode)
|
||||
{
|
||||
@@ -181,7 +181,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
|
||||
* @api
|
||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||
*
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||
*/
|
||||
protected function OnCheckCredentials(&$iErrorCode)
|
||||
{
|
||||
@@ -192,7 +192,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
|
||||
* @api
|
||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||
*
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||
*/
|
||||
protected function OnCredentialsOK(&$iErrorCode)
|
||||
{
|
||||
@@ -203,7 +203,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
|
||||
* @api
|
||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||
*
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||
*/
|
||||
protected function OnUsersOK(&$iErrorCode)
|
||||
{
|
||||
@@ -214,7 +214,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
|
||||
* @api
|
||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||
*
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||
*/
|
||||
protected function OnConnected(&$iErrorCode)
|
||||
{
|
||||
@@ -225,7 +225,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
|
||||
* @api
|
||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||
*
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
|
||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||
*/
|
||||
protected function OnError(&$iErrorCode)
|
||||
{
|
||||
|
||||
@@ -805,16 +805,16 @@ HTML
|
||||
if (!$this->IsNew()) {
|
||||
// Look for any trigger that considers this object as "In Scope"
|
||||
// If any trigger has been found then display a tab with notifications
|
||||
//
|
||||
// If all triggers on an object have been deleted, we consider that we no longer need the event notification information
|
||||
$aTriggers = $this->GetRelatedTriggersIDs();
|
||||
if (count($aTriggers) > 0) {
|
||||
$iId = $this->GetKey();
|
||||
$aParams = array('triggers' => $aTriggers, 'id' => $iId);
|
||||
$aParams = array('class' => get_class($this), 'id' => $iId);
|
||||
$aNotifSearches = array();
|
||||
$iNotifsCount = 0;
|
||||
$aNotificationClasses = MetaModel::EnumChildClasses('EventNotification');
|
||||
foreach ($aNotificationClasses as $sNotifClass) {
|
||||
$aNotifSearches[$sNotifClass] = DBObjectSearch::FromOQL("SELECT $sNotifClass AS Ev JOIN Trigger AS T ON Ev.trigger_id = T.id WHERE T.id IN (:triggers) AND Ev.object_id = :id");
|
||||
$aNotifSearches[$sNotifClass] = DBObjectSearch::FromOQL("SELECT $sNotifClass AS Ev WHERE Ev.object_id = :id AND Ev.object_class = :class");
|
||||
$aNotifSearches[$sNotifClass]->SetInternalParams($aParams);
|
||||
$oNotifSet = new DBObjectSet($aNotifSearches[$sNotifClass], array());
|
||||
$iNotifsCount += $oNotifSet->Count();
|
||||
@@ -4570,6 +4570,8 @@ HTML;
|
||||
/** @var \iApplicationObjectExtension $oExtensionInstance */
|
||||
foreach(MetaModel::EnumPlugins('iApplicationObjectExtension') as $oExtensionInstance)
|
||||
{
|
||||
$sExtensionClass = get_class($oExtensionInstance);
|
||||
$this->LogCRUDDebug(__METHOD__, "Calling $sExtensionClass::OnDBInsert()");
|
||||
$oKPI = new ExecutionKPI();
|
||||
$oExtensionInstance->OnDBInsert($oNewObj, self::GetCurrentChange());
|
||||
$oKPI->ComputeStatsForExtension($oExtensionInstance, 'OnDBInsert');
|
||||
@@ -4651,7 +4653,22 @@ HTML;
|
||||
return $oDeletionPlan;
|
||||
}
|
||||
|
||||
protected function PostDeleteActions(): void
|
||||
final protected function PreDeleteActions(): void
|
||||
{
|
||||
/** @var \iApplicationObjectExtension $oExtensionInstance */
|
||||
foreach(MetaModel::EnumPlugins('iApplicationObjectExtension') as $oExtensionInstance)
|
||||
{
|
||||
$sExtensionClass = get_class($oExtensionInstance);
|
||||
$this->LogCRUDDebug(__METHOD__, "Calling $sExtensionClass::OnDBDelete()");
|
||||
$oKPI = new ExecutionKPI();
|
||||
$oExtensionInstance->OnDBDelete($this, self::GetCurrentChange());
|
||||
$oKPI->ComputeStatsForExtension($oExtensionInstance, 'OnDBDelete');
|
||||
}
|
||||
|
||||
parent::PreDeleteActions();
|
||||
}
|
||||
|
||||
final protected function PostDeleteActions(): void
|
||||
{
|
||||
parent::PostDeleteActions();
|
||||
}
|
||||
@@ -4665,6 +4682,8 @@ HTML;
|
||||
/** @var \iApplicationObjectExtension $oExtensionInstance */
|
||||
foreach(MetaModel::EnumPlugins('iApplicationObjectExtension') as $oExtensionInstance)
|
||||
{
|
||||
$sExtensionClass = get_class($oExtensionInstance);
|
||||
$this->LogCRUDDebug(__METHOD__, "Calling $sExtensionClass::OnDBDelete()");
|
||||
$oKPI = new ExecutionKPI();
|
||||
$oExtensionInstance->OnDBDelete($this, self::GetCurrentChange());
|
||||
$oKPI->ComputeStatsForExtension($oExtensionInstance, 'OnDBDelete');
|
||||
@@ -4686,6 +4705,7 @@ HTML;
|
||||
foreach(MetaModel::EnumPlugins('iApplicationObjectExtension') as $oExtensionInstance)
|
||||
{
|
||||
$sExtensionClass = get_class($oExtensionInstance);
|
||||
$this->LogCRUDDebug(__METHOD__, "Calling $sExtensionClass::OnIsModified()");
|
||||
$oKPI = new ExecutionKPI();
|
||||
$bIsModified = $oExtensionInstance->OnIsModified($this);
|
||||
$oKPI->ComputeStatsForExtension($oExtensionInstance, 'OnIsModified');
|
||||
@@ -4745,6 +4765,8 @@ HTML;
|
||||
/** @var \iApplicationObjectExtension $oExtensionInstance */
|
||||
foreach(MetaModel::EnumPlugins('iApplicationObjectExtension') as $oExtensionInstance)
|
||||
{
|
||||
$sExtensionClass = get_class($oExtensionInstance);
|
||||
$this->LogCRUDDebug(__METHOD__, "Calling $sExtensionClass::OnCheckToWrite()");
|
||||
$oKPI = new ExecutionKPI();
|
||||
$aNewIssues = $oExtensionInstance->OnCheckToWrite($this);
|
||||
$oKPI->ComputeStatsForExtension($oExtensionInstance, 'OnCheckToWrite');
|
||||
@@ -4795,6 +4817,8 @@ HTML;
|
||||
/** @var \iApplicationObjectExtension $oExtensionInstance */
|
||||
foreach(MetaModel::EnumPlugins('iApplicationObjectExtension') as $oExtensionInstance)
|
||||
{
|
||||
$sExtensionClass = get_class($oExtensionInstance);
|
||||
$this->LogCRUDDebug(__METHOD__, "Calling $sExtensionClass::OnCheckToDelete()");
|
||||
$oKPI = new ExecutionKPI();
|
||||
$aNewIssues = $oExtensionInstance->OnCheckToDelete($this);
|
||||
$oKPI->ComputeStatsForExtension($oExtensionInstance, 'OnCheckToDelete');
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2">
|
||||
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
|
||||
<classes>
|
||||
<class id="AbstractResource" _delta="define">
|
||||
<parent>cmdbAbstractObject</parent>
|
||||
@@ -45,7 +45,7 @@
|
||||
<properties>
|
||||
<comment>/** Acknowledge welcome popup messages */</comment>
|
||||
<abstract>false</abstract>
|
||||
<category></category>
|
||||
<category/>
|
||||
<key_type>autoincrement</key_type>
|
||||
<db_table>priv_welcome_popup_acknowledge</db_table>
|
||||
</properties>
|
||||
@@ -185,6 +185,11 @@
|
||||
<decoration_classes>fas fa-cog</decoration_classes>
|
||||
</style>
|
||||
</menu>
|
||||
<menu id="Integrations" xsi:type="TemplateMenuNode" _delta="define">
|
||||
<rank>50</rank>
|
||||
<parent>ConfigurationTools</parent>
|
||||
<template_file/>
|
||||
</menu>
|
||||
<menu id="DataSources" xsi:type="OQLMenuNode" _delta="define">
|
||||
<rank>20</rank>
|
||||
<parent>ConfigurationTools</parent>
|
||||
|
||||
@@ -706,7 +706,7 @@ class DisplayBlock
|
||||
if ($bDoSearch)
|
||||
{
|
||||
// Keep the table_id identifying this table if we're performing a search
|
||||
$sTableId = utils::ReadParam('_table_id_', null, false, 'raw_data');
|
||||
$sTableId = utils::ReadParam('_table_id_', null, false, utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER);
|
||||
if ($sTableId != null)
|
||||
{
|
||||
$aExtraParams['table_id'] = $sTableId;
|
||||
@@ -1686,19 +1686,16 @@ JS
|
||||
$aRes = CMDBSource::QueryToArray($sSql);
|
||||
$oContext = new ApplicationContext();
|
||||
$sContextParam = $oContext->GetForLink();
|
||||
/** @var AttributeDefinition $oGroupByAttDef */
|
||||
$oGroupByAttDef = $aGroupBy["grouped_by_1"]->GetAttDef();
|
||||
|
||||
$iTotalCount = 0;
|
||||
$aURLs = array();
|
||||
|
||||
foreach ($aRes as $iRow => $aRow) {
|
||||
$sValue = $aRow['grouped_by_1'];
|
||||
$sPlainTextValue = $oGroupByAttDef->GetValueLabel($sValue);
|
||||
$sHtmlValue = utils::EscapeHtml($sPlainTextValue);
|
||||
$sHtmlValue = $oGroupByExp->MakeValueLabel($this->m_oFilter, $sValue, $sValue);
|
||||
$iTotalCount += $aRow['_itop_count_'];
|
||||
$aValues[] = array(
|
||||
'label' => $sPlainTextValue,
|
||||
'label' => html_entity_decode(strip_tags($sHtmlValue), ENT_QUOTES, 'UTF-8'),
|
||||
'label_html' => $sHtmlValue,
|
||||
'value' => (float)$aRow[$sFctVar],
|
||||
);
|
||||
|
||||
@@ -303,7 +303,7 @@ class ExcelExporter
|
||||
{
|
||||
if ($this->sOutputFilePath == null)
|
||||
{
|
||||
return APPROOT.'data/bulk_export/'.$this->sToken.'.xlsx';
|
||||
return utils::GetDataPath().'bulk_export/'.$this->sToken.'.xlsx';
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -313,14 +313,14 @@ class ExcelExporter
|
||||
|
||||
public static function GetExcelFileFromToken($sToken)
|
||||
{
|
||||
return @file_get_contents(APPROOT.'data/bulk_export/'.$sToken.'.xlsx');
|
||||
return @file_get_contents(utils::GetDataPath().'bulk_export/'.$sToken.'.xlsx');
|
||||
}
|
||||
|
||||
public static function CleanupFromToken($sToken)
|
||||
{
|
||||
@unlink(APPROOT.'data/bulk_export/'.$sToken.'.status');
|
||||
@unlink(APPROOT.'data/bulk_export/'.$sToken.'.data');
|
||||
@unlink(APPROOT.'data/bulk_export/'.$sToken.'.xlsx');
|
||||
@unlink(utils::GetDataPath().'bulk_export/'.$sToken.'.status');
|
||||
@unlink(utils::GetDataPath().'bulk_export/'.$sToken.'.data');
|
||||
@unlink(utils::GetDataPath().'bulk_export/'.$sToken.'.xlsx');
|
||||
}
|
||||
|
||||
public function Cleanup()
|
||||
@@ -334,7 +334,7 @@ class ExcelExporter
|
||||
*/
|
||||
public static function CleanupOldFiles()
|
||||
{
|
||||
$aFiles = glob(APPROOT.'data/bulk_export/*.*');
|
||||
$aFiles = glob(utils::GetDataPath().'bulk_export/*.*');
|
||||
$iDelay = MetaModel::GetConfig()->Get('xlsx_exporter_cleanup_old_files_delay');
|
||||
|
||||
if($iDelay > 0)
|
||||
@@ -416,14 +416,14 @@ class ExcelExporter
|
||||
|
||||
protected function CheckDataDir()
|
||||
{
|
||||
if(!is_dir(APPROOT."data/bulk_export"))
|
||||
if(!is_dir(utils::GetDataPath()."bulk_export"))
|
||||
{
|
||||
@mkdir(APPROOT."data/bulk_export", 0777, true /* recursive */);
|
||||
@mkdir(utils::GetDataPath()."bulk_export", 0777, true /* recursive */);
|
||||
clearstatcache();
|
||||
}
|
||||
if (!is_writable(APPROOT."data/bulk_export"))
|
||||
if (!is_writable(utils::GetDataPath()."bulk_export"))
|
||||
{
|
||||
throw new Exception('Data directory "'.APPROOT.'data/bulk_export" could not be written.');
|
||||
throw new Exception('Data directory "'.utils::GetDataPath().'bulk_export" could not be written.');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -433,12 +433,12 @@ class ExcelExporter
|
||||
{
|
||||
$sToken = $this->sToken;
|
||||
}
|
||||
return APPROOT."data/bulk_export/$sToken.status";
|
||||
return utils::GetDataPath()."bulk_export/$sToken.status";
|
||||
}
|
||||
|
||||
protected function GetDataFile()
|
||||
{
|
||||
return APPROOT.'data/bulk_export/'.$this->sToken.'.data';
|
||||
return utils::GetDataPath().'bulk_export/'.$this->sToken.'.data';
|
||||
}
|
||||
|
||||
protected function GetNewToken()
|
||||
|
||||
@@ -60,6 +60,24 @@ class CoreCannotSaveObjectException extends CoreException
|
||||
return $sContent;
|
||||
}
|
||||
|
||||
public function getTextMessage()
|
||||
{
|
||||
$sTitle = Dict::S('UI:Error:SaveFailed');
|
||||
$sContent = utils::HtmlEntities($sTitle);
|
||||
|
||||
if (count($this->aIssues) == 1) {
|
||||
$sIssue = reset($this->aIssues);
|
||||
$sContent .= utils::HtmlEntities($sIssue);
|
||||
} else {
|
||||
foreach ($this->aIssues as $sError) {
|
||||
$sContent .= " ".utils::HtmlEntities($sError).", ";
|
||||
}
|
||||
}
|
||||
|
||||
return $sContent;
|
||||
}
|
||||
|
||||
|
||||
public function getIssues()
|
||||
{
|
||||
return $this->aIssues;
|
||||
|
||||
@@ -209,7 +209,7 @@ class DesignerForm
|
||||
public function RenderAsPropertySheet($oP, $bReturnHTML = false, $sNotifyParentSelector = null)
|
||||
{
|
||||
$sReturn = '';
|
||||
$sActionUrl = addslashes($this->sSubmitTo);
|
||||
$sActionUrl = addslashes($this->sSubmitTo ?? '');
|
||||
$sJSSubmitParams = json_encode($this->aSubmitParams);
|
||||
$sFormId = $this->GetFormId();
|
||||
if ($this->oParentForm == null) {
|
||||
@@ -1330,7 +1330,8 @@ class DesignerComboField extends DesignerFormField
|
||||
{
|
||||
if ($this->bMultipleSelection)
|
||||
{
|
||||
$sHtml = "<span><select $sCSSClasses multiple size=\"8\"id=\"$sId\" name=\"$sName\">";
|
||||
$iSize = max(1, min(8, count($this->aAllowedValues)));
|
||||
$sHtml = "<span><select $sCSSClasses multiple size=\"$iSize\" id=\"$sId\" name=\"$sName\">";
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -53,6 +53,12 @@ class LoginDefaultBefore extends AbstractLoginFSMExtension
|
||||
{
|
||||
// Force login mode
|
||||
LoginWebPage::SetLoginModeAndReload($sProposedLoginMode);
|
||||
} else {
|
||||
$sRawLoginMode = utils::ReadParam('login_mode', '', false, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
|
||||
if ($sProposedLoginMode !== $sRawLoginMode) {
|
||||
IssueLog::Error("Authentication issue due to login_mode parameter sanitization. Please avoid special characters", null, ['sRawLoginMode' => $sRawLoginMode]);
|
||||
//IssueLog::Error("Authentication issue due to login_mode parameter sanitization. Please avoid special characters", null, ['sRawLoginMode' => utils::HtmlEntities($sRawLoginMode)]);
|
||||
}
|
||||
}
|
||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||
}
|
||||
|
||||
@@ -52,12 +52,13 @@ class LoginTwigContext
|
||||
/**
|
||||
* Set the absolute path on disk of the folder containing the twig templates
|
||||
*
|
||||
* @param string $sPath absolute path of twig templates directory
|
||||
* @api
|
||||
*
|
||||
*@param string $sAbsPath Absolute path of twig templates directory
|
||||
*/
|
||||
public function SetLoaderPath($sPath)
|
||||
public function SetLoaderPath($sAbsPath)
|
||||
{
|
||||
$this->sTwigLoaderPath = $sPath;
|
||||
$this->sTwigLoaderPath = $sAbsPath;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -84,24 +85,27 @@ class LoginTwigContext
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the URL of a CSS file to link to the login screen
|
||||
* Add the absolute URL of a CSS file to link to the login screen
|
||||
*
|
||||
* @param string $sFile URL of the CSS file to link
|
||||
* @api
|
||||
*
|
||||
* @param string $sFileAbsURL Absolute URL of the CSS file to link
|
||||
*/
|
||||
public function AddCSSFile($sFile)
|
||||
public function AddCSSFile($sFileAbsURL)
|
||||
{
|
||||
$this->aCSSFiles[] = $sFile;
|
||||
$this->aCSSFiles[] = $sFileAbsURL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the URL of a javascript file to link to the login screen
|
||||
* @param string $sFile URL of the javascript file to link
|
||||
* Add the absolute URL of a javascript file to link to the login screen
|
||||
*
|
||||
* @api
|
||||
*
|
||||
* @param string $sFileAbsURL Absolute URL of the javascript file to link
|
||||
*/
|
||||
public function AddJsFile($sFile)
|
||||
public function AddJsFile($sFileAbsURL)
|
||||
{
|
||||
$this->aJsFiles[] = $sFile;
|
||||
$this->aJsFiles[] = $sFileAbsURL;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -133,7 +137,7 @@ class LoginTwigContext
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
* @return array Absolute URLs of the CSS files
|
||||
*/
|
||||
public function GetCSSFiles()
|
||||
{
|
||||
@@ -141,7 +145,7 @@ class LoginTwigContext
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
* @return array Absolute URLs of the JS files
|
||||
*/
|
||||
public function GetJsFiles()
|
||||
{
|
||||
@@ -274,12 +278,12 @@ class LoginTwigRenderer
|
||||
$aCSSFiles = $oFormData->GetCSSFiles();
|
||||
foreach ($aCSSFiles as $sCSSFile)
|
||||
{
|
||||
$oPage->add_linked_stylesheet($sCSSFile);
|
||||
$oPage->LinkStylesheetFromURI($sCSSFile);
|
||||
}
|
||||
$aJsFiles = $oFormData->GetJsFiles();
|
||||
foreach ($aJsFiles as $sJsFile)
|
||||
{
|
||||
$oPage->add_linked_script($sJsFile);
|
||||
$oPage->LinkScriptFromURI($sJsFile);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -228,7 +228,7 @@ class privUITransactionFile
|
||||
*/
|
||||
public static function GetNewTransactionId()
|
||||
{
|
||||
if (!is_dir(APPROOT.'data/transactions'))
|
||||
if (!is_dir(utils::GetDataPath().'transactions'))
|
||||
{
|
||||
if (!is_writable(APPROOT.'data'))
|
||||
{
|
||||
@@ -236,22 +236,22 @@ class privUITransactionFile
|
||||
}
|
||||
// condition avoids race condition N°2345
|
||||
// See https://github.com/kalessil/phpinspectionsea/blob/master/docs/probable-bugs.md#mkdir-race-condition
|
||||
if (!mkdir($concurrentDirectory = APPROOT.'data/transactions') && !is_dir($concurrentDirectory))
|
||||
if (!mkdir($concurrentDirectory = utils::GetDataPath().'transactions') && !is_dir($concurrentDirectory))
|
||||
{
|
||||
throw new Exception('Failed to create the directory "'.APPROOT.'data/transactions". Ajust the rights on the parent directory or let an administrator create the transactions directory and give the web sever enough rights to write into it.');
|
||||
throw new Exception('Failed to create the directory "'.utils::GetDataPath().'transactions". Ajust the rights on the parent directory or let an administrator create the transactions directory and give the web sever enough rights to write into it.');
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_writable(APPROOT.'data/transactions'))
|
||||
if (!is_writable(utils::GetDataPath().'transactions'))
|
||||
{
|
||||
throw new Exception('The directory "'.APPROOT.'data/transactions" must be writable to the application.');
|
||||
throw new Exception('The directory "'.utils::GetDataPath().'transactions" must be writable to the application.');
|
||||
}
|
||||
|
||||
$iCurrentUserId = static::GetCurrentUserId();
|
||||
|
||||
self::CleanupOldTransactions();
|
||||
|
||||
$sTransactionIdFullPath = tempnam(APPROOT.'data/transactions', static::GetUserPrefix());
|
||||
$sTransactionIdFullPath = tempnam(utils::GetDataPath().'transactions', static::GetUserPrefix());
|
||||
file_put_contents($sTransactionIdFullPath, $iCurrentUserId, LOCK_EX);
|
||||
|
||||
$sTransactionIdFileName = basename($sTransactionIdFullPath);
|
||||
@@ -274,8 +274,8 @@ class privUITransactionFile
|
||||
*/
|
||||
public static function IsTransactionValid($id, $bRemoveTransaction = true)
|
||||
{
|
||||
// Constraint the transaction file within APPROOT.'data/transactions'
|
||||
$sTransactionDir = realpath(APPROOT.'data/transactions');
|
||||
// Constraint the transaction file within utils::GetDataPath().'transactions'
|
||||
$sTransactionDir = realpath(utils::GetDataPath().'transactions');
|
||||
$sFilepath = utils::RealPath($sTransactionDir.'/'.$id, $sTransactionDir);
|
||||
if (($sFilepath === false) || (strlen($sTransactionDir) == strlen($sFilepath)))
|
||||
{
|
||||
@@ -348,7 +348,7 @@ class privUITransactionFile
|
||||
|
||||
clearstatcache();
|
||||
$iLimit = time() - 24*3600;
|
||||
$sPattern = $sTransactionDir ? "$sTransactionDir/*" : APPROOT.'data/transactions/*';
|
||||
$sPattern = $sTransactionDir ? "$sTransactionDir/*" : utils::GetDataPath().'transactions/*';
|
||||
$aTransactions = glob($sPattern);
|
||||
foreach($aTransactions as $sFileName)
|
||||
{
|
||||
@@ -368,7 +368,7 @@ class privUITransactionFile
|
||||
{
|
||||
clearstatcache();
|
||||
$aResult = array();
|
||||
$aTransactions = glob(APPROOT.'data/transactions/'.self::GetUserPrefix().'*');
|
||||
$aTransactions = glob(utils::GetDataPath().'transactions/'.self::GetUserPrefix().'*');
|
||||
foreach($aTransactions as $sFileName)
|
||||
{
|
||||
$aResult[] = date('Y-m-d H:i:s', filemtime($sFileName)).' - '.basename($sFileName);
|
||||
|
||||
@@ -17,6 +17,7 @@ require_once(APPROOT.'application/displayblock.class.inc.php');
|
||||
class UILinksWidget
|
||||
{
|
||||
protected $m_sClass;
|
||||
protected $m_sClassLabel;
|
||||
protected $m_sAttCode;
|
||||
protected $m_sNameSuffix;
|
||||
protected $m_sInputId;
|
||||
@@ -24,6 +25,7 @@ class UILinksWidget
|
||||
protected $m_sExtKeyToRemote;
|
||||
protected $m_sExtKeyToMe;
|
||||
protected $m_sLinkedClass;
|
||||
protected $m_sLinkedClassLabel;
|
||||
protected $m_sRemoteClass;
|
||||
protected $m_bDuplicatesAllowed;
|
||||
/** @var string[] list of editables attcodes */
|
||||
@@ -46,6 +48,7 @@ class UILinksWidget
|
||||
public function __construct($sClass, $sAttCode, $sInputId, $sNameSuffix = '', $bDuplicatesAllowed = false)
|
||||
{
|
||||
$this->m_sClass = $sClass;
|
||||
$this->m_sClassLabel = MetaModel::GetName($this->m_sClass);
|
||||
$this->m_sAttCode = $sAttCode;
|
||||
$this->m_sInputId = $sInputId;
|
||||
$this->m_sNameSuffix = $sNameSuffix;
|
||||
@@ -56,6 +59,7 @@ class UILinksWidget
|
||||
/** @var AttributeLinkedSetIndirect $oAttDef */
|
||||
$oAttDef = MetaModel::GetAttributeDef($this->m_sClass, $this->m_sAttCode);
|
||||
$this->m_sLinkedClass = $oAttDef->GetLinkedClass();
|
||||
$this->m_sLinkedClassLabel = MetaModel::GetName($this->m_sLinkedClass);
|
||||
$this->m_sExtKeyToRemote = $oAttDef->GetExtKeyToRemote();
|
||||
$this->m_sExtKeyToMe = $oAttDef->GetExtKeyToMe();
|
||||
|
||||
@@ -365,11 +369,21 @@ class UILinksWidget
|
||||
return $this->m_sClass;
|
||||
}
|
||||
|
||||
public function GetClassLabel(): string
|
||||
{
|
||||
return $this->m_sClassLabel;
|
||||
}
|
||||
|
||||
public function GetLinkedClass(): string
|
||||
{
|
||||
return $this->m_sLinkedClass;
|
||||
}
|
||||
|
||||
public function GetLinkedClassLabel(): string
|
||||
{
|
||||
return $this->m_sLinkedClassLabel;
|
||||
}
|
||||
|
||||
public function GetAttCode(): string
|
||||
{
|
||||
return $this->m_sAttCode;
|
||||
|
||||
@@ -251,7 +251,7 @@ class appUserPreferences extends DBObject
|
||||
"key_type" => "autoincrement",
|
||||
"name_attcode" => "userid",
|
||||
"state_attcode" => "",
|
||||
"reconc_keys" => array(),
|
||||
"reconc_keys" => array("userid"),
|
||||
"db_table" => "priv_app_preferences",
|
||||
"db_key_field" => "id",
|
||||
"db_finalclass_field" => "",
|
||||
@@ -260,6 +260,8 @@ class appUserPreferences extends DBObject
|
||||
MetaModel::Init_Params($aParams);
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("userid", array("targetclass"=>"User", "allowed_values"=>null, "sql"=>"userid", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributePropertySet("preferences", array("allowed_values"=>null, "sql"=>"preferences", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
MetaModel::Init_SetZListItems('list', array('preferences',));
|
||||
MetaModel::Init_SetZListItems('default_search', array('userid'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -22,10 +22,12 @@ use Combodo\iTop\Application\UI\Base\iUIBlock;
|
||||
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock;
|
||||
use Combodo\iTop\Application\UI\Hook\iKeyboardShortcut;
|
||||
use Combodo\iTop\Application\WebPage\WebPage;
|
||||
use Combodo\iTop\Service\InterfaceDiscovery\InterfaceDiscovery;
|
||||
use Combodo\iTop\Service\Module\ModuleService;
|
||||
use ScssPhp\ScssPhp\Compiler;
|
||||
use ScssPhp\ScssPhp\OutputStyle;
|
||||
use ScssPhp\ScssPhp\ValueConverter;
|
||||
use Soundasleep\Html2Text;
|
||||
|
||||
|
||||
/**
|
||||
@@ -111,6 +113,11 @@ class utils
|
||||
* @since 2.7.10 3.0.0
|
||||
*/
|
||||
public const ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER = 'element_identifier';
|
||||
/**
|
||||
* @var string For XML / HTML node id/class selector
|
||||
* @since 3.1.2 3.2.1
|
||||
*/
|
||||
public const ENUM_SANITIZATION_FILTER_ELEMENT_SELECTOR = 'element_selector';
|
||||
/**
|
||||
* @var string For variables names
|
||||
* @since 3.0.0
|
||||
@@ -495,8 +502,17 @@ class utils
|
||||
}
|
||||
break;
|
||||
|
||||
// For XML / HTML node identifiers
|
||||
case static::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER:
|
||||
$retValue = preg_replace('/[^a-zA-Z0-9_-]/', '', $value);
|
||||
$retValue = filter_var($retValue, FILTER_VALIDATE_REGEXP,
|
||||
['options' => ['regexp' => '/^[A-Za-z0-9][A-Za-z0-9_-]*$/']]);
|
||||
break;
|
||||
|
||||
// For XML / HTML node id selector
|
||||
case static::ENUM_SANITIZATION_FILTER_ELEMENT_SELECTOR:
|
||||
$retValue = filter_var($value, FILTER_VALIDATE_REGEXP,
|
||||
['options' => ['regexp' => '/^[#\.][A-Za-z0-9][A-Za-z0-9_-]*$/']]);
|
||||
break;
|
||||
|
||||
case static::ENUM_SANITIZATION_FILTER_VARIABLE_NAME:
|
||||
@@ -1928,7 +1944,7 @@ SQL;
|
||||
CURLOPT_HEADER => false, // don't return the headers in the output
|
||||
CURLOPT_FOLLOWLOCATION => true, // follow redirects
|
||||
CURLOPT_ENCODING => "", // handle all encodings
|
||||
CURLOPT_USERAGENT => "spider", // who am i
|
||||
CURLOPT_USERAGENT => static::GetConfig()->Get('http.request.user_agent'), // who am i
|
||||
CURLOPT_AUTOREFERER => true, // set referer on redirect
|
||||
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
|
||||
CURLOPT_TIMEOUT => 120, // timeout on response
|
||||
@@ -2067,7 +2083,7 @@ SQL;
|
||||
{
|
||||
try {
|
||||
//return '<?xml encoding="UTF-8">'.$sHtml;
|
||||
return \Html2Text\Html2Text::convert('<?xml encoding="UTF-8">'.$sHtml);
|
||||
return Html2Text::convert('<?xml encoding="UTF-8">'.$sHtml, ['ignore_errors' => true]);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
return $e->getMessage();
|
||||
@@ -2489,6 +2505,15 @@ SQL;
|
||||
$sData = @file_get_contents($sPath);
|
||||
if ($sData === false)
|
||||
{
|
||||
IssueLog::Error(<<<TXT
|
||||
Failed to load the file from URL. This can happen for multiple reasons:
|
||||
- Invalid URL
|
||||
- URL using HTTPS with an untrusted certificate on the remote server
|
||||
- ...
|
||||
TXT
|
||||
, LogChannels::CORE, [
|
||||
'URL' => $sPath,
|
||||
]);
|
||||
throw new Exception("Failed to load the file from the URL '$sPath'.");
|
||||
}
|
||||
else
|
||||
@@ -2782,95 +2807,12 @@ SQL;
|
||||
*
|
||||
* @return array classes are returned in the same order as the module dependency tree, so core classes on top
|
||||
* @since 3.0.0
|
||||
* @deprecated 3.2.0 Use {@see InterfaceDiscovery::FindItopClasses()} instead
|
||||
*/
|
||||
public static function GetClassesForInterface(string $sInterface, string $sClassNameFilter = '', $aExcludedPath = []): array
|
||||
{
|
||||
$aMatchingClasses = [];
|
||||
|
||||
if (!utils::IsDevelopmentEnvironment()) {
|
||||
// Try to read from cache
|
||||
$aFilePath = explode("\\", $sInterface);
|
||||
$sInterfaceName = end($aFilePath);
|
||||
$sCacheFileName = utils::GetCachePath()."ImplementingInterfaces/$sInterfaceName.php";
|
||||
if (is_file($sCacheFileName)) {
|
||||
$aMatchingClasses = include $sCacheFileName;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($aMatchingClasses)) {
|
||||
$aAutoloadClassMaps = [APPROOT.'lib/composer/autoload_classmap.php'];
|
||||
// guess all the autoload class maps from the extensions
|
||||
$aAutoloadClassMaps = array_merge($aAutoloadClassMaps, glob(APPROOT.'env-'.utils::GetCurrentEnvironment().'/*/vendor/composer/autoload_classmap.php'));
|
||||
|
||||
$aClassMap = [];
|
||||
$aAutoloaderErrors = [];
|
||||
foreach ($aAutoloadClassMaps as $sAutoloadFile) {
|
||||
if (false === static::RealPath($sAutoloadFile, APPROOT)) {
|
||||
// can happen when we still have the autoloader symlink in env-*, but it points to a file that no longer exists
|
||||
$aAutoloaderErrors[] = $sAutoloadFile;
|
||||
continue;
|
||||
}
|
||||
$aTmpClassMap = include $sAutoloadFile;
|
||||
/** @noinspection SlowArrayOperationsInLoopInspection we are getting an associative array so the documented workarounds cannot be used */
|
||||
$aClassMap = array_merge($aClassMap, $aTmpClassMap);
|
||||
}
|
||||
if (count($aAutoloaderErrors) > 0) {
|
||||
IssueLog::Debug(
|
||||
"\utils::GetClassesForInterface cannot load some of the autoloader files",
|
||||
LogChannels::CORE,
|
||||
['autoloader_errors' => $aAutoloaderErrors]
|
||||
);
|
||||
}
|
||||
|
||||
// Add already loaded classes
|
||||
$aCurrentClasses = array_fill_keys(get_declared_classes(), '');
|
||||
$aClassMap = array_merge($aCurrentClasses, $aClassMap);
|
||||
|
||||
foreach ($aClassMap as $sPHPClass => $sPHPFile) {
|
||||
$bSkipped = false;
|
||||
|
||||
// Check if our class matches name filter, or is in an excluded path
|
||||
if ($sClassNameFilter !== '' && strpos($sPHPClass, $sClassNameFilter) === false) {
|
||||
$bSkipped = true;
|
||||
}
|
||||
// For some PHP classes we don't have their file path as they are already in memory, so we never filter on their paths
|
||||
elseif (utils::IsNotNullOrEmptyString($sPHPFile)) {
|
||||
$sPHPFile = self::LocalPath($sPHPFile);
|
||||
if ($sPHPFile !== false) {
|
||||
$sPHPFile = '/'.$sPHPFile; // for regex
|
||||
foreach ($aExcludedPath as $sExcludedPath) {
|
||||
// Note: We use '#' as delimiters as usual '/' is often used in paths.
|
||||
if ($sExcludedPath !== '' && preg_match('#'.$sExcludedPath.'#', $sPHPFile) === 1) {
|
||||
$bSkipped = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$bSkipped = true; // file not found
|
||||
}
|
||||
}
|
||||
|
||||
if(!$bSkipped){
|
||||
try {
|
||||
$oRefClass = new ReflectionClass($sPHPClass);
|
||||
if ($oRefClass->implementsInterface($sInterface) &&
|
||||
!$oRefClass->isInterface() && !$oRefClass->isAbstract() && !$oRefClass->isTrait()) {
|
||||
$aMatchingClasses[] = $sPHPClass;
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!utils::IsDevelopmentEnvironment()) {
|
||||
// Save to cache
|
||||
$sCacheContent = "<?php\n\nreturn ".var_export($aMatchingClasses, true).";";
|
||||
SetupUtils::builddir(dirname($sCacheFileName));
|
||||
file_put_contents($sCacheFileName, $sCacheContent);
|
||||
}
|
||||
}
|
||||
|
||||
return $aMatchingClasses;
|
||||
$oInterfaceDiscoveryService = InterfaceDiscovery::GetInstance();
|
||||
return $oInterfaceDiscoveryService->FindItopClasses($sInterface);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2884,9 +2826,9 @@ SQL;
|
||||
{
|
||||
$aResultPref = [];
|
||||
$aShortcutPrefs = appUserPreferences::GetPref('keyboard_shortcuts', []);
|
||||
// Note: Mind the 4 blackslashes, see utils::GetClassesForInterface()
|
||||
$aShortcutClasses = utils::GetClassesForInterface(iKeyboardShortcut::class, '', array('[\\\\/]lib[\\\\/]', '[\\\\/]node_modules[\\\\/]', '[\\\\/]test[\\\\/]', '[\\\\/]tests[\\\\/]'));
|
||||
|
||||
/** @var iKeyboardShortcut[] $aShortcutClasses */
|
||||
$aShortcutClasses = InterfaceDiscovery::GetInstance()->FindItopClasses(iKeyboardShortcut::class);
|
||||
foreach ($aShortcutClasses as $cShortcutPlugin) {
|
||||
$sTriggeredElement = $cShortcutPlugin::GetShortcutTriggeredElementSelector();
|
||||
foreach ($cShortcutPlugin::GetShortcutKeys() as $aShortcutKey) {
|
||||
|
||||
@@ -11,7 +11,7 @@ define('APPCONF', APPROOT.'conf/');
|
||||
*
|
||||
* @see ITOP_CORE_VERSION to get full iTop core version
|
||||
*/
|
||||
define('ITOP_DESIGN_LATEST_VERSION', '3.2');
|
||||
define('ITOP_DESIGN_LATEST_VERSION', '3.3');
|
||||
|
||||
/**
|
||||
* Constant containing the iTop core version, whatever application was built
|
||||
@@ -23,7 +23,7 @@ define('ITOP_DESIGN_LATEST_VERSION', '3.2');
|
||||
* @used-by utils::GetItopVersionWikiSyntax()
|
||||
* @used-by iTopModulesPhpVersionIntegrationTest
|
||||
*/
|
||||
define('ITOP_CORE_VERSION', '3.2.0');
|
||||
define('ITOP_CORE_VERSION', '3.3.0');
|
||||
|
||||
/**
|
||||
* @var string
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
"symfony/yaml": "~6.4.0",
|
||||
"tecnickcom/tcpdf": "^6.6.0",
|
||||
"thenetworg/oauth2-azure": "^2.0",
|
||||
"masterminds/html5": "^2.8.0"
|
||||
"soundasleep/html2text": "~2.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/debug-bundle": "~6.4.0",
|
||||
|
||||
138
composer.lock
generated
138
composer.lock
generated
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "c8ab1de6659dd4fa2ded6043615b86e6",
|
||||
"content-hash": "18d0c769ec5c249b96e3be8f168bbb11",
|
||||
"packages": [
|
||||
{
|
||||
"name": "apereo/phpcas",
|
||||
@@ -1018,73 +1018,6 @@
|
||||
},
|
||||
"time": "2023-03-17T15:20:52+00:00"
|
||||
},
|
||||
{
|
||||
"name": "masterminds/html5",
|
||||
"version": "2.9.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/Masterminds/html5-php.git",
|
||||
"reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6",
|
||||
"reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-dom": "*",
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.7-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Masterminds\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Matt Butcher",
|
||||
"email": "technosophos@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Matt Farina",
|
||||
"email": "matt@mattfarina.com"
|
||||
},
|
||||
{
|
||||
"name": "Asmir Mustafic",
|
||||
"email": "goetas@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "An HTML5 parser and serializer.",
|
||||
"homepage": "http://masterminds.github.io/html5-php",
|
||||
"keywords": [
|
||||
"HTML5",
|
||||
"dom",
|
||||
"html",
|
||||
"parser",
|
||||
"querypath",
|
||||
"serializer",
|
||||
"xml"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/Masterminds/html5-php/issues",
|
||||
"source": "https://github.com/Masterminds/html5-php/tree/2.9.0"
|
||||
},
|
||||
"time": "2024-03-31T07:05:07+00:00"
|
||||
},
|
||||
{
|
||||
"name": "nikic/php-parser",
|
||||
"version": "v4.18.0",
|
||||
@@ -2041,6 +1974,61 @@
|
||||
},
|
||||
"time": "2024-01-13T12:36:40+00:00"
|
||||
},
|
||||
{
|
||||
"name": "soundasleep/html2text",
|
||||
"version": "2.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/soundasleep/html2text.git",
|
||||
"reference": "83502b6f8f1aaef8e2e238897199d64f284b4af3"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/soundasleep/html2text/zipball/83502b6f8f1aaef8e2e238897199d64f284b4af3",
|
||||
"reference": "83502b6f8f1aaef8e2e238897199d64f284b4af3",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-dom": "*",
|
||||
"ext-libxml": "*",
|
||||
"php": "^7.3|^8.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpstan/phpstan": "^1.9",
|
||||
"phpunit/phpunit": "^7.0|^8.0|^9.0"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Soundasleep\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Jevon Wright",
|
||||
"homepage": "https://jevon.org",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "A PHP script to convert HTML into a plain text format",
|
||||
"homepage": "https://github.com/soundasleep/html2text",
|
||||
"keywords": [
|
||||
"email",
|
||||
"html",
|
||||
"php",
|
||||
"text"
|
||||
],
|
||||
"support": {
|
||||
"email": "support@jevon.org",
|
||||
"issues": "https://github.com/soundasleep/html2text/issues",
|
||||
"source": "https://github.com/soundasleep/html2text/tree/2.1.0"
|
||||
},
|
||||
"time": "2023-01-06T09:28:15+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/cache",
|
||||
"version": "v6.4.2",
|
||||
@@ -4856,20 +4844,20 @@
|
||||
},
|
||||
{
|
||||
"name": "tecnickcom/tcpdf",
|
||||
"version": "6.6.5",
|
||||
"version": "6.7.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/tecnickcom/TCPDF.git",
|
||||
"reference": "5fce932fcee4371865314ab7f6c0d85423c5c7ce"
|
||||
"reference": "951eabf0338ec2522bd0d5d9c79b08a3a3d36b36"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/5fce932fcee4371865314ab7f6c0d85423c5c7ce",
|
||||
"reference": "5fce932fcee4371865314ab7f6c0d85423c5c7ce",
|
||||
"url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/951eabf0338ec2522bd0d5d9c79b08a3a3d36b36",
|
||||
"reference": "951eabf0338ec2522bd0d5d9c79b08a3a3d36b36",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0"
|
||||
"php": ">=5.5.0"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
@@ -4916,7 +4904,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/tecnickcom/TCPDF/issues",
|
||||
"source": "https://github.com/tecnickcom/TCPDF/tree/6.6.5"
|
||||
"source": "https://github.com/tecnickcom/TCPDF/tree/6.7.5"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -4924,7 +4912,7 @@
|
||||
"type": "custom"
|
||||
}
|
||||
],
|
||||
"time": "2023-09-06T15:09:26+00:00"
|
||||
"time": "2024-04-20T17:25:10+00:00"
|
||||
},
|
||||
{
|
||||
"name": "thenetworg/oauth2-azure",
|
||||
|
||||
@@ -566,6 +566,7 @@ class ActionEmail extends ActionNotification
|
||||
$oLog->Set('trigger_id', $oTrigger->GetKey());
|
||||
$oLog->Set('action_id', $this->GetKey());
|
||||
$oLog->Set('object_id', $aContextArgs['this->object()']->GetKey());
|
||||
$oLog->Set('object_class', get_class($aContextArgs['this->object()']));
|
||||
// Must be inserted now so that it gets a valid id that will make the link
|
||||
// between an eventual asynchronous task (queued) and the log
|
||||
$oLog->DBInsertNoReload();
|
||||
@@ -628,7 +629,7 @@ class ActionEmail extends ActionNotification
|
||||
*/
|
||||
protected function _DoExecute($oTrigger, $aContextArgs, &$oLog)
|
||||
{
|
||||
$sStyles = file_get_contents(APPROOT.'css/email.css');
|
||||
$sStyles = file_get_contents(APPROOT . utils::GetCSSFromSASS("css/email.scss"));
|
||||
$sStyles .= MetaModel::GetConfig()->Get('email_css');
|
||||
|
||||
$oEmail = new EMail();
|
||||
@@ -867,7 +868,13 @@ class ActionEmail extends ActionNotification
|
||||
*/
|
||||
protected function BuildMessageBody(bool $bHighlightPlaceholders = false): string
|
||||
{
|
||||
$sBody = $this->Get('body');
|
||||
// Wrap content with a specific class in order to apply styles of HTML fields through the emogrifier (see `css/email.scss`)
|
||||
$sBody = <<<HTML
|
||||
<div class="email-is-html-content">
|
||||
{$this->Get('body')}
|
||||
</div>
|
||||
HTML;
|
||||
|
||||
/** @var ormDocument $oHtmlTemplate */
|
||||
$oHtmlTemplate = $this->Get('html_template');
|
||||
if ($oHtmlTemplate && !$oHtmlTemplate->IsEmpty()) {
|
||||
|
||||
@@ -2069,7 +2069,7 @@ class AttributeLinkedSet extends AttributeDefinition
|
||||
public function GetImportColumns()
|
||||
{
|
||||
$aColumns = array();
|
||||
$aColumns[$this->GetCode()] = 'TEXT'.CMDBSource::GetSqlStringColumnDefinition();
|
||||
$aColumns[$this->GetCode()] = 'MEDIUMTEXT'.CMDBSource::GetSqlStringColumnDefinition();
|
||||
|
||||
return $aColumns;
|
||||
}
|
||||
|
||||
@@ -201,6 +201,7 @@ abstract class AbstractWeeklyScheduledProcess implements iScheduledProcess
|
||||
static::MODULE_SETTING_TIME,
|
||||
static::GetDefaultModuleSettingTime()
|
||||
);
|
||||
$sProcessTime = trim($sProcessTime);
|
||||
if (!preg_match('/[0-2]\d:[0-5]\d/', $sProcessTime))
|
||||
{
|
||||
throw new ProcessInvalidConfigException($this->GetModuleName().": wrong format for setting '".static::MODULE_SETTING_TIME."' (found '$sProcessTime')");
|
||||
@@ -230,7 +231,7 @@ abstract class AbstractWeeklyScheduledProcess implements iScheduledProcess
|
||||
$iFirstDayOfWeek = $aDays[0];
|
||||
$iDayMove = $oNow->format('N') - $iFirstDayOfWeek;
|
||||
$oRet = clone $oNow;
|
||||
$oRet->modify('-'.$iDayMove.' days');
|
||||
$oRet->modify(-$iDayMove.' days');
|
||||
$oRet->modify('+1 weeks');
|
||||
}
|
||||
else
|
||||
@@ -238,7 +239,7 @@ abstract class AbstractWeeklyScheduledProcess implements iScheduledProcess
|
||||
$iNextDayOfWeek = $aDays[$iNextPos];
|
||||
$iMove = $iNextDayOfWeek - $oNow->format('N');
|
||||
$oRet = clone $oNow;
|
||||
$oRet->modify('+'.$iMove.' days');
|
||||
$oRet->modify($iMove.' days');
|
||||
}
|
||||
list($sHours, $sMinutes) = explode(':', $sProcessTime);
|
||||
$oRet->setTime((int)$sHours, (int)$sMinutes);
|
||||
|
||||
@@ -474,14 +474,14 @@ abstract class BulkExport
|
||||
*/
|
||||
protected function MakeTmpFile($sExtension)
|
||||
{
|
||||
if(!is_dir(APPROOT."data/bulk_export"))
|
||||
if(!is_dir(utils::GetDataPath()."bulk_export"))
|
||||
{
|
||||
@mkdir(APPROOT."data/bulk_export", 0777, true /* recursive */);
|
||||
@mkdir(utils::GetDataPath()."bulk_export", 0777, true /* recursive */);
|
||||
clearstatcache();
|
||||
}
|
||||
if (!is_writable(APPROOT."data/bulk_export"))
|
||||
if (!is_writable(utils::GetDataPath()."bulk_export"))
|
||||
{
|
||||
throw new Exception('Data directory "'.APPROOT.'data/bulk_export" could not be written.');
|
||||
throw new Exception('Data directory "'.utils::GetDataPath().'bulk_export" could not be written.');
|
||||
}
|
||||
|
||||
$iNum = rand();
|
||||
@@ -489,7 +489,7 @@ abstract class BulkExport
|
||||
{
|
||||
$iNum++;
|
||||
$sToken = sprintf("%08x", $iNum);
|
||||
$sFileName = APPROOT."data/bulk_export/$sToken.".$sExtension;
|
||||
$sFileName = utils::GetDataPath()."bulk_export/$sToken.".$sExtension;
|
||||
$hFile = @fopen($sFileName, 'x');
|
||||
}
|
||||
while($hFile === false);
|
||||
|
||||
@@ -1169,8 +1169,8 @@ class CMDBSource
|
||||
*/
|
||||
public static function IsSameFieldTypes($sItopGeneratedFieldType, $sDbFieldType)
|
||||
{
|
||||
list($sItopFieldDataType, $sItopFieldTypeOptions, $sItopFieldOtherOptions) = static::GetFieldDataTypeAndOptions($sItopGeneratedFieldType);
|
||||
list($sDbFieldDataType, $sDbFieldTypeOptions, $sDbFieldOtherOptions) = static::GetFieldDataTypeAndOptions($sDbFieldType);
|
||||
[$sItopFieldDataType, $sItopFieldTypeOptions, $sItopFieldOtherOptions] = static::GetFieldDataTypeAndOptions($sItopGeneratedFieldType);
|
||||
[$sDbFieldDataType, $sDbFieldTypeOptions, $sDbFieldOtherOptions] = static::GetFieldDataTypeAndOptions($sDbFieldType);
|
||||
|
||||
if (strcasecmp($sItopFieldDataType, $sDbFieldDataType) !== 0)
|
||||
{
|
||||
@@ -1603,7 +1603,19 @@ class CMDBSource
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
public static function GetClusterNb()
|
||||
{
|
||||
$result = 0;
|
||||
$sSql = "SHOW STATUS LIKE 'wsrep_cluster_size';";
|
||||
$aRows = self::QueryToArray($sSql);
|
||||
if (count($aRows) > 0)
|
||||
{
|
||||
$result = $aRows[0]['Value'];
|
||||
}
|
||||
return intval($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see https://dev.mysql.com/doc/refman/5.7/en/charset-database.html
|
||||
* @return string query to upgrade database charset and collation if needed, null if not
|
||||
* @throws \MySQLException
|
||||
|
||||
@@ -108,7 +108,7 @@ class DefaultWorkingTimeComputer implements iWorkingTimeComputer
|
||||
// Default implementation: 24x7, no holidays: to compute the deadline, just add
|
||||
// the specified duration to the given date/time
|
||||
$oResult = clone $oStartDate;
|
||||
$oResult->modify('+'.$iDuration.' seconds');
|
||||
$oResult->modify($iDuration.' seconds');
|
||||
if (class_exists('WorkingTimeRecorder'))
|
||||
{
|
||||
WorkingTimeRecorder::SetValues($oStartDate->format('U'), $oResult->format('U'), $iDuration, WorkingTimeRecorder::COMPUTED_END);
|
||||
|
||||
@@ -29,7 +29,7 @@ define('ITOP_APPLICATION_SHORT', 'iTop');
|
||||
*
|
||||
* @see ITOP_CORE_VERSION to get iTop core version
|
||||
*/
|
||||
define('ITOP_VERSION', '3.2.0-dev');
|
||||
define('ITOP_VERSION', '3.3.0-dev');
|
||||
|
||||
define('ITOP_VERSION_NAME', 'Fullmoon');
|
||||
define('ITOP_REVISION', 'svn');
|
||||
@@ -71,7 +71,7 @@ define('DEFAULT_MAX_DISPLAY_LIMIT', 30);
|
||||
define('DEFAULT_STANDARD_RELOAD_INTERVAL', 5 * 60);
|
||||
define('DEFAULT_FAST_RELOAD_INTERVAL', 1 * 60);
|
||||
define('DEFAULT_SECURE_CONNECTION_REQUIRED', false);
|
||||
define('DEFAULT_ALLOWED_LOGIN_TYPES', 'form|external|basic');
|
||||
define('DEFAULT_ALLOWED_LOGIN_TYPES', 'form|external|basic|token');
|
||||
define('DEFAULT_EXT_AUTH_VARIABLE', '$_SERVER[\'REMOTE_USER\']');
|
||||
define('DEFAULT_ENCRYPTION_KEY', '@iT0pEncr1pti0n!'); // We'll use a random generated key later (if possible)
|
||||
define('DEFAULT_ENCRYPTION_LIB', 'Mcrypt'); // We'll define the best encryption available later
|
||||
@@ -1747,6 +1747,14 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'developer_mode.interface_cache.enabled' => [
|
||||
'type' => 'bool',
|
||||
'description' => 'If true then InterfaceDiscovery uses dynamic cache (in developer_mode)',
|
||||
'default' => false,
|
||||
'value' => false,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'theme.enable_precompilation' => [
|
||||
'type' => 'bool',
|
||||
'description' => 'If false, theme compilation will not use any precompiled file setup optimization.)',
|
||||
@@ -1787,6 +1795,13 @@ class Config
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
],
|
||||
'http.request.user_agent' => [
|
||||
'type' => 'string',
|
||||
'description' => 'HTTP request user agent, use this to set a custom agent on external requests.',
|
||||
'default' => ITOP_APPLICATION.'/'.ITOP_VERSION,
|
||||
'source_of_value' => '',
|
||||
'show_in_conf_sample' => false,
|
||||
]
|
||||
];
|
||||
|
||||
public function IsProperty($sPropCode)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2">
|
||||
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
|
||||
<classes>
|
||||
<class id="lnkActionNotificationToContact" _delta="define">
|
||||
<parent>cmdbAbstractObject</parent>
|
||||
@@ -16,6 +16,13 @@
|
||||
<attribute id="contact_id"/>
|
||||
</attributes>
|
||||
</naming>
|
||||
<reconciliation>
|
||||
<attributes>
|
||||
<attribute id="action_id"/>
|
||||
<attribute id="contact_id"/>
|
||||
<attribute id="trigger_id"/>
|
||||
</attributes>
|
||||
</reconciliation>
|
||||
<uniqueness_rules>
|
||||
<rule>
|
||||
<attributes>
|
||||
@@ -92,7 +99,7 @@
|
||||
</presentation>
|
||||
<methods/>
|
||||
</class>
|
||||
<class id="ActionNewsroom" _delta="define">
|
||||
<class id="ActionNewsroom" _delta="define">
|
||||
<php_parent>
|
||||
<name>ActionNotification</name>
|
||||
</php_parent>
|
||||
@@ -116,6 +123,11 @@
|
||||
<style>
|
||||
<icon>../../images/icons/icons8-notification.svg</icon>
|
||||
</style>
|
||||
<reconciliation>
|
||||
<attributes>
|
||||
<attribute id="name"/>
|
||||
</attributes>
|
||||
</reconciliation>
|
||||
</properties>
|
||||
<fields>
|
||||
<field id="title" xsi:type="AttributeString">
|
||||
@@ -136,7 +148,7 @@
|
||||
<display_max_height>96</display_max_height>
|
||||
<storage_max_width>256</storage_max_width>
|
||||
<storage_max_height>256</storage_max_height>
|
||||
<default_image />
|
||||
<default_image/>
|
||||
</field>
|
||||
<field id="priority" xsi:type="AttributeEnum">
|
||||
<sql>priority</sql>
|
||||
@@ -171,7 +183,7 @@
|
||||
</field>
|
||||
<field id="url" xsi:type="AttributeString">
|
||||
<sql>url</sql>
|
||||
<default_value>$this->url()$</default_value>
|
||||
<default_value>$this->url()$</default_value>
|
||||
<is_null_allowed>false</is_null_allowed>
|
||||
</field>
|
||||
</fields>
|
||||
@@ -185,18 +197,21 @@
|
||||
<item id="name">
|
||||
<rank>10</rank>
|
||||
</item>
|
||||
<item id="status">
|
||||
<item id="description">
|
||||
<rank>20</rank>
|
||||
</item>
|
||||
<item id="language">
|
||||
<item id="status">
|
||||
<rank>30</rank>
|
||||
</item>
|
||||
<item id="title">
|
||||
<item id="language">
|
||||
<rank>40</rank>
|
||||
</item>
|
||||
<item id="message">
|
||||
<item id="title">
|
||||
<rank>50</rank>
|
||||
</item>
|
||||
<item id="message">
|
||||
<rank>60</rank>
|
||||
</item>
|
||||
</items>
|
||||
</item>
|
||||
<item id="fieldset:ActionNewsroom:trigger">
|
||||
@@ -241,12 +256,15 @@
|
||||
<item id="title">
|
||||
<rank>10</rank>
|
||||
</item>
|
||||
<item id="status">
|
||||
<item id="description">
|
||||
<rank>20</rank>
|
||||
</item>
|
||||
<item id="language">
|
||||
<item id="status">
|
||||
<rank>30</rank>
|
||||
</item>
|
||||
<item id="language">
|
||||
<rank>40</rank>
|
||||
</item>
|
||||
</items>
|
||||
</list>
|
||||
</presentation>
|
||||
@@ -351,7 +369,7 @@
|
||||
]]></code>
|
||||
</method>
|
||||
<method id="GetAsynchronousGlobalSetting">
|
||||
<comment></comment>
|
||||
<comment/>
|
||||
<static>true</static>
|
||||
<access>public</access>
|
||||
<code><![CDATA[
|
||||
@@ -363,7 +381,7 @@
|
||||
</method>
|
||||
</methods>
|
||||
</class>
|
||||
<class id="EventNotificationNewsroom" _delta="define">
|
||||
<class id="EventNotificationNewsroom" _delta="define">
|
||||
<php_parent>
|
||||
<name>EventNotification</name>
|
||||
</php_parent>
|
||||
@@ -380,9 +398,14 @@
|
||||
<attribute id="title"/>
|
||||
</attributes>
|
||||
</naming>
|
||||
<reconciliation>
|
||||
<attributes>
|
||||
<attribute id="title"/>
|
||||
</attributes>
|
||||
</reconciliation>
|
||||
<order>
|
||||
<columns>
|
||||
<column id="date" ascending="false" />
|
||||
<column id="date" ascending="false"/>
|
||||
</columns>
|
||||
</order>
|
||||
</properties>
|
||||
@@ -396,7 +419,7 @@
|
||||
<sql>icon</sql>
|
||||
<default_value/>
|
||||
<is_null_allowed>true</is_null_allowed>
|
||||
<default_image />
|
||||
<default_image/>
|
||||
</field>
|
||||
<field id="priority" xsi:type="AttributeEnum">
|
||||
<sql>priority</sql>
|
||||
@@ -478,14 +501,14 @@
|
||||
</items>
|
||||
</details>
|
||||
<summary>
|
||||
<items>
|
||||
<item id="date">
|
||||
<rank>10</rank>
|
||||
</item>
|
||||
<item id="message">
|
||||
<rank>20</rank>
|
||||
</item>
|
||||
</items>
|
||||
<items>
|
||||
<item id="date">
|
||||
<rank>10</rank>
|
||||
</item>
|
||||
<item id="message">
|
||||
<rank>20</rank>
|
||||
</item>
|
||||
</items>
|
||||
</summary>
|
||||
<list>
|
||||
<items>
|
||||
|
||||
@@ -768,6 +768,42 @@ abstract class DBObject implements iDisplay
|
||||
$this->Set($sAttCode, $sValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \CoreException
|
||||
* @throws \CoreUnexpectedValue
|
||||
* @throws \MySQLException
|
||||
* @throws \OQLException
|
||||
* @throws \ReflectionException
|
||||
*/
|
||||
protected function PreDeleteActions(): void
|
||||
{
|
||||
$this->SetReadOnly('No modification allowed before delete');
|
||||
$this->FireEventAboutToDelete();
|
||||
$oKPI = new ExecutionKPI();
|
||||
$this->OnDelete();
|
||||
$oKPI->ComputeStatsForExtension($this, 'OnDelete');
|
||||
|
||||
// Activate any existing trigger
|
||||
$sClass = get_class($this);
|
||||
$aParams = array('class_list' => MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL));
|
||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL('SELECT TriggerOnObjectDelete AS t WHERE t.target_class IN (:class_list)'), array(),
|
||||
$aParams);
|
||||
while ($oTrigger = $oSet->Fetch()) {
|
||||
/** @var \TriggerOnObjectDelete $oTrigger */
|
||||
try {
|
||||
$oKPI = new ExecutionKPI();
|
||||
$oTrigger->DoActivate($this->ToArgs('this'));
|
||||
}
|
||||
catch (Exception $e) {
|
||||
$oTrigger->LogException($e, $this);
|
||||
utils::EnrichRaisedException($oTrigger, $e);
|
||||
}
|
||||
finally {
|
||||
$oKPI->ComputeStatsForExtension($this, 'TriggerOnObjectDelete');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
* @throws \ReflectionException
|
||||
@@ -3458,6 +3494,7 @@ abstract class DBObject implements iDisplay
|
||||
|
||||
$this->m_bIsInDB = true;
|
||||
$this->m_bDirty = false;
|
||||
$this->m_bFullyLoaded = true;
|
||||
foreach ($this->m_aCurrValues as $sAttCode => $value) {
|
||||
if (is_object($value)) {
|
||||
$value = clone $value;
|
||||
@@ -4092,16 +4129,17 @@ abstract class DBObject implements iDisplay
|
||||
CMDBSource::DeleteFrom($sDeleteSQL);
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* @throws ArchivedObjectException
|
||||
* @throws CoreException
|
||||
* @throws CoreUnexpectedValue
|
||||
* @throws MySQLException
|
||||
* @throws MySQLHasGoneAwayException
|
||||
* @throws OQLException
|
||||
*/
|
||||
/**
|
||||
* @internal
|
||||
*
|
||||
* @throws \CoreException
|
||||
* @throws \CoreUnexpectedValue
|
||||
* @throws \MySQLException
|
||||
* @throws \MySQLHasGoneAwayException
|
||||
* @throws \OQLException
|
||||
* @throws \Random\RandomException
|
||||
* @throws \ReflectionException
|
||||
*/
|
||||
protected function DBDeleteSingleObject()
|
||||
{
|
||||
$this->LogCRUDEnter(__METHOD__);
|
||||
@@ -4112,29 +4150,7 @@ abstract class DBObject implements iDisplay
|
||||
return;
|
||||
}
|
||||
|
||||
$this->SetReadOnly("No modification allowed before delete");
|
||||
$this->FireEventAboutToDelete();
|
||||
$oKPI = new ExecutionKPI();
|
||||
$this->OnDelete();
|
||||
$oKPI->ComputeStatsForExtension($this, 'OnDelete');
|
||||
|
||||
// Activate any existing trigger
|
||||
$sClass = get_class($this);
|
||||
$aParams = array('class_list' => MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL));
|
||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnObjectDelete AS t WHERE t.target_class IN (:class_list)"), array(),
|
||||
$aParams);
|
||||
while ($oTrigger = $oSet->Fetch())
|
||||
{
|
||||
/** @var \TriggerOnObjectDelete $oTrigger */
|
||||
try
|
||||
{
|
||||
$oTrigger->DoActivate($this->ToArgs('this'));
|
||||
}
|
||||
catch(Exception $e) {
|
||||
$oTrigger->LogException($e, $this);
|
||||
utils::EnrichRaisedException($oTrigger, $e);
|
||||
}
|
||||
}
|
||||
$this->PreDeleteActions();
|
||||
|
||||
$this->RecordObjDeletion($this->m_iKey); // May cause a reload for storing history information
|
||||
|
||||
|
||||
@@ -1552,13 +1552,13 @@ abstract class DBSearch
|
||||
}
|
||||
|
||||
$sLogFile = 'queries.latest';
|
||||
file_put_contents(APPROOT.'data/'.$sLogFile.'.html', $sHtml);
|
||||
file_put_contents(utils::GetDataPath().$sLogFile.'.html', $sHtml);
|
||||
|
||||
$sLog = "<?php\n\$aQueriesLog = ".var_export(self::$m_aQueriesLog, true).";";
|
||||
file_put_contents(APPROOT.'data/'.$sLogFile.'.log', $sLog);
|
||||
file_put_contents(utils::GetDataPath().$sLogFile.'.log', $sLog);
|
||||
|
||||
// Cumulate the queries
|
||||
$sAllQueries = APPROOT.'data/queries.log';
|
||||
$sAllQueries = utils::GetDataPath().'queries.log';
|
||||
if (file_exists($sAllQueries))
|
||||
{
|
||||
// Merge the new queries into the existing log
|
||||
|
||||
@@ -70,7 +70,7 @@ class Dict
|
||||
|
||||
public static function GetUserLanguage()
|
||||
{
|
||||
if (self::$m_sCurrentLanguage == null) // May happen when no user is logged in (i.e login screen, non authentifed page)
|
||||
if (self::$m_sCurrentLanguage == null) // May happen when no user is logged in (i.e. login screen, non-authenticated page)
|
||||
{
|
||||
// In which case let's use the default language
|
||||
return self::$m_sDefaultLanguage;
|
||||
@@ -122,7 +122,7 @@ class Dict
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a localised string from the dictonary with its associated lang code
|
||||
* Returns a localised string from the dictionary with its associated lang code
|
||||
*
|
||||
* @param string $sStringCode The code identifying the dictionary entry
|
||||
* @param string $sDefault Default value if there is no match in the dictionary
|
||||
@@ -201,7 +201,7 @@ class Dict
|
||||
|
||||
if ($sLocalizedFormat == $sFormatCode)
|
||||
{
|
||||
// Make sure the information will be displayed (ex: an error occuring before the dictionary gets loaded)
|
||||
// Make sure the information will be displayed (ex: an error occurring before the dictionary gets loaded)
|
||||
return $sFormatCode.' - '.implode(', ', $aArguments);
|
||||
}
|
||||
|
||||
@@ -214,9 +214,9 @@ class Dict
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize a the entries for a given language (replaces the former Add() method)
|
||||
* Initialize the entries for a given language (replaces the former Add() method)
|
||||
* @param string $sLanguageCode Code identifying the language i.e. 'FR-FR', 'EN-US'
|
||||
* @param array $aEntries Hash array of dictionnary entries
|
||||
* @param array $aEntries Hash array of dictionary entries
|
||||
*/
|
||||
public static function SetEntries($sLanguageCode, $aEntries)
|
||||
{
|
||||
@@ -271,9 +271,9 @@ class Dict
|
||||
if (self::$m_aData[$sLangCode] === false) {
|
||||
unset(self::$m_aData[$sLangCode]);
|
||||
} else if (! is_array(self::$m_aData[$sLangCode])) {
|
||||
// N°4125: we dont fix dictionnary corrupted cache (on iTop side).
|
||||
// N°4125: we don't fix dictionary corrupted cache (on iTop side).
|
||||
// but we log an error in a dedicated channel to let itop administrator be aware of a potential APCu issue to fix.
|
||||
IssueLog::Error("APCu corrupted data (with $sLangCode dictionnary). APCu configuration and running version should be troubleshooted...", LogChannels::APC);
|
||||
IssueLog::Error("APCu corrupted data (with $sLangCode dictionary). APCu configuration and running version should be troubleshooted...", LogChannels::APC);
|
||||
$bResult = true;
|
||||
} else {
|
||||
$bResult = true;
|
||||
@@ -296,7 +296,7 @@ class Dict
|
||||
|
||||
/**
|
||||
* Enable caching (cached using APC)
|
||||
* @param string $sApplicationPrefix The prefix for uniquely identiying this iTop instance
|
||||
* @param string $sApplicationPrefix The prefix for uniquely identifying this iTop instance
|
||||
*/
|
||||
public static function EnableCache($sApplicationPrefix)
|
||||
{
|
||||
@@ -305,7 +305,7 @@ class Dict
|
||||
|
||||
/**
|
||||
* Reset the cached entries (cached using APC)
|
||||
* @param string $sApplicationPrefix The prefix for uniquely identiying this iTop instance
|
||||
* @param string $sApplicationPrefix The prefix for uniquely identifying this iTop instance
|
||||
*/
|
||||
public static function ResetCache($sApplicationPrefix)
|
||||
{
|
||||
@@ -385,7 +385,7 @@ class Dict
|
||||
// sLanguageCode: Code identifying the language i.e. FR-FR
|
||||
// sEnglishLanguageDesc: Description of the language code, in English. i.e. French (France)
|
||||
// sLocalizedLanguageDesc: Description of the language code, in its own language. i.e. Français (France)
|
||||
// aEntries: Hash array of dictionnary entries
|
||||
// aEntries: Hash array of dictionary entries
|
||||
// ~~ or ~* can be used to indicate entries still to be translated.
|
||||
public static function Add($sLanguageCode, $sEnglishLanguageDesc, $sLocalizedLanguageDesc, $aEntries)
|
||||
{
|
||||
|
||||
@@ -1496,6 +1496,7 @@ class DisplayableGraph extends SimpleGraph
|
||||
'excluded' => $aExcludedByClass,
|
||||
'grouping_threshold' => $iGroupingThreshold,
|
||||
'export_as_pdf' => array('url' => $sExportAsPdfURL, 'label' => Dict::S('UI:Relation:ExportAsPDF')),
|
||||
'transaction_id' => utils::GetNewTransactionId(),
|
||||
'export_as_attachment' => array('url' => $sExportAsDocumentURL, 'label' => Dict::S('UI:Relation:ExportAsAttachment'), 'obj_class' => $sObjClass, 'obj_key' => $iObjKey),
|
||||
'drill_down' => array('url' => $sDrillDownURL, 'label' => Dict::S('UI:Relation:DrillDown')),
|
||||
'labels' => array(
|
||||
|
||||
@@ -154,7 +154,7 @@ class EMail implements iEMail
|
||||
*/
|
||||
public function SetInReplyTo(string $sMessageId)
|
||||
{
|
||||
$this->AddToHeader('In-Reply-To', $sMessageId);
|
||||
$this->oMailer->SetInReplyTo($sMessageId);
|
||||
}
|
||||
|
||||
public function SetBody($sBody, $sMimeType = 'text/html', $sCustomStyles = null)
|
||||
|
||||
@@ -131,7 +131,7 @@ class EventNotification extends Event
|
||||
"db_finalclass_field" => "",
|
||||
"order_by_default" => array('date' => false),
|
||||
'indexes' => array(
|
||||
array('object_id'),
|
||||
array( 'object_class', 'object_id'),
|
||||
)
|
||||
);
|
||||
MetaModel::Init_Params($aParams);
|
||||
@@ -139,9 +139,11 @@ class EventNotification extends Event
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("trigger_id", array("targetclass"=>"Trigger", "jointype"=> "", "allowed_values"=>null, "sql"=>"trigger_id", "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("action_id", array("targetclass" => "Action", "jointype" => "", "allowed_values" => null, "sql" => "action_id", "is_null_allowed" => false, "on_target_delete" => DEL_AUTO, "depends_on" => array())));
|
||||
MetaModel::Init_AddAttribute(new AttributeInteger("object_id", array("allowed_values" => null, "sql" => "object_id", "default_value" => 0, "is_null_allowed" => false, "depends_on" => array())));
|
||||
//@since 3.2.0
|
||||
MetaModel::Init_AddAttribute(new AttributeClass("object_class", array("class_category"=>"", "more_values"=>"", "sql"=>"object_class", "default_value"=>null, "is_null_allowed"=>true /*to avoid setting AbstractResource as default in database*/, "depends_on"=>array())));
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('date', 'message', 'userinfo', 'trigger_id', 'action_id', 'object_id')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('details', array('date', 'message', 'userinfo', 'trigger_id', 'action_id', 'object_class', 'object_id')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('date', 'message')); // Attributes to be displayed for a list
|
||||
// Search criteria
|
||||
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
|
||||
@@ -176,7 +178,7 @@ class EventNotificationEmail extends EventNotification
|
||||
MetaModel::Init_AddAttribute(new AttributeTable("attachments", array("allowed_values"=>null, "sql"=>"attachments", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
|
||||
|
||||
// Display lists
|
||||
MetaModel::Init_SetZListItems('details', array('date', 'userinfo', 'message', 'trigger_id', 'action_id', 'object_id', 'to', 'cc', 'bcc', 'from', 'subject', 'body', 'attachments')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('details', array('date', 'userinfo', 'message', 'trigger_id', 'action_id', 'object_class', 'object_id', 'to', 'cc', 'bcc', 'from', 'subject', 'body', 'attachments')); // Attributes to be displayed for the complete details
|
||||
MetaModel::Init_SetZListItems('list', array('date', 'message', 'to', 'subject', 'attachments')); // Attributes to be displayed for a list
|
||||
|
||||
// Search criteria
|
||||
@@ -231,7 +233,7 @@ class EventIssue extends Event
|
||||
|
||||
if (array_key_exists('_GET', $GLOBALS) && is_array($GLOBALS['_GET']))
|
||||
{
|
||||
$this->Set('arguments_get', $GLOBALS['_GET']);
|
||||
$this->Set('arguments_get', $this->SanitizeRequestParams($GLOBALS['_GET']));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -240,22 +242,7 @@ class EventIssue extends Event
|
||||
|
||||
if (array_key_exists('_POST', $GLOBALS) && is_array($GLOBALS['_POST']))
|
||||
{
|
||||
$aPost = array();
|
||||
foreach($GLOBALS['_POST'] as $sKey => $sValue)
|
||||
{
|
||||
if (is_string($sValue))
|
||||
{
|
||||
if (mb_strlen($sValue) < 256) {
|
||||
$aPost[$sKey] = $sValue;
|
||||
} else {
|
||||
$aPost[$sKey] = "!long string: ".mb_strlen($sValue)." chars";
|
||||
}
|
||||
} else {
|
||||
// Not a string (avoid warnings in case the value cannot be easily casted into a string)
|
||||
$aPost[$sKey] = @(string)$sValue;
|
||||
}
|
||||
}
|
||||
$this->Set('arguments_post', $aPost);
|
||||
$this->Set('arguments_post', $this->SanitizeRequestParams($GLOBALS['_POST']));
|
||||
} else {
|
||||
$this->Set('arguments_post', array());
|
||||
}
|
||||
@@ -274,6 +261,29 @@ class EventIssue extends Event
|
||||
$this->Set('page', mb_substr($this->Get('page'), 0, 210)." -truncated ($sLength chars)");
|
||||
}
|
||||
}
|
||||
|
||||
protected function SanitizeRequestParams(array $aParams): array
|
||||
{
|
||||
$aSanitizedParams = [];
|
||||
|
||||
foreach ($aParams as $sKey => $sValue) {
|
||||
if (is_string($sValue)) {
|
||||
if (stristr($sKey, 'pwd') !== false || stristr($sKey, 'passwd') !== false || stristr($sKey, 'password') !== false) {
|
||||
$aSanitizedParams[$sKey] = '****';
|
||||
} elseif (mb_strlen($sValue) < 256) {
|
||||
$aSanitizedParams[$sKey] = $sValue;
|
||||
} else {
|
||||
$aSanitizedParams[$sKey] = '!long string: '.mb_strlen($sValue).' chars';
|
||||
}
|
||||
} else {
|
||||
// Not a string (avoid warnings in case the value cannot be easily cast into a string)
|
||||
$aSanitizedParams[$sKey] = @(string)$sValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $aSanitizedParams;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -301,6 +301,8 @@ class HTMLDOMSanitizer extends DOMSanitizer
|
||||
'section' => array('style', 'class'),
|
||||
'code' => array('style', 'class'),
|
||||
'table' => array('style', 'class', 'width', 'summary', 'align', 'border', 'cellpadding', 'cellspacing'),
|
||||
'colgroup' => array(),
|
||||
'col' => array('style'),
|
||||
'thead' => array('style', 'class'),
|
||||
'tbody' => array('style', 'class'),
|
||||
'tr' => array('style', 'class', 'colspan', 'rowspan'),
|
||||
|
||||
@@ -541,80 +541,6 @@ JS
|
||||
CombodoCKEditorHandler.EnableImageUpload('#' + $(this).attr('id'), '$sAbsoluteUrlAppRoot'+'pages/ajax.render.php?operation=cke_img_upload&temp_id=$sTempId&obj_class=$sObjClass&obj_key=$iObjKey');
|
||||
});
|
||||
JS;
|
||||
|
||||
return
|
||||
<<<JS
|
||||
// Hook the file upload of all CKEditor instances
|
||||
$('.htmlEditor').each(function() {
|
||||
var oEditor = $(this).ckeditorGet();
|
||||
oEditor.config.filebrowserBrowseUrl = '$sAbsoluteUrlAppRoot'+'pages/ajax.render.php?operation=cke_browse&temp_id=$sTempId&obj_class=$sObjClass&obj_key=$iObjKey';
|
||||
oEditor.on( 'fileUploadResponse', function( evt ) {
|
||||
var fileLoader = evt.data.fileLoader;
|
||||
var xhr = fileLoader.xhr;
|
||||
var data = evt.data;
|
||||
try {
|
||||
var response = JSON.parse( xhr.responseText );
|
||||
|
||||
// Error message does not need to mean that upload finished unsuccessfully.
|
||||
// It could mean that ex. file name was changes during upload due to naming collision.
|
||||
if ( response.error && response.error.message ) {
|
||||
data.message = response.error.message;
|
||||
}
|
||||
|
||||
// But !uploaded means error.
|
||||
if ( !response.uploaded ) {
|
||||
evt.cancel();
|
||||
} else {
|
||||
data.fileName = response.fileName;
|
||||
data.url = response.url;
|
||||
|
||||
// Do not call the default listener.
|
||||
evt.stop();
|
||||
}
|
||||
} catch ( err ) {
|
||||
// Response parsing error.
|
||||
data.message = fileLoader.lang.filetools.responseError;
|
||||
window.console && window.console.log( xhr.responseText );
|
||||
|
||||
evt.cancel();
|
||||
}
|
||||
} );
|
||||
|
||||
oEditor.on( 'fileUploadRequest', function( evt ) {
|
||||
evt.data.fileLoader.uploadUrl += '?operation=cke_img_upload&temp_id=$sTempId&obj_class=$sObjClass';
|
||||
}, null, null, 4 ); // Listener with priority 4 will be executed before priority 5.
|
||||
|
||||
oEditor.on( 'instanceReady', function() {
|
||||
if(!CKEDITOR.env.iOS && $('#'+oEditor.id+'_toolbox .ibo-vendors-ckeditor--toolbar-fullscreen-button').length == 0)
|
||||
{
|
||||
$('#'+oEditor.id+'_toolbox').append('<span class="ibo-vendors-ckeditor--toolbar-fullscreen-button editor-fullscreen-button" data-role="ibo-vendors-ckeditor--toolbar-fullscreen-button" title="$sToggleFullScreen"> </span>');
|
||||
$('#'+oEditor.id+'_toolbox .ibo-vendors-ckeditor--toolbar-fullscreen-button').on('click', function() {
|
||||
oEditor.execCommand('maximize');
|
||||
if ($(this).closest('.cke_maximized').length != 0)
|
||||
{
|
||||
$('#'+oEditor.id+'_toolbar_collapser').trigger('click');
|
||||
}
|
||||
});
|
||||
}
|
||||
if (oEditor.widgets.registered.uploadimage)
|
||||
{
|
||||
oEditor.widgets.registered.uploadimage.onUploaded = function( upload ) {
|
||||
var oData = JSON.parse(upload.xhr.responseText);
|
||||
this.replaceWith( '<img src="' + upload.url + '" ' +
|
||||
'width="' + oData.width + '" ' +
|
||||
'height="' + oData.height + '">' );
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
JS
|
||||
;
|
||||
}
|
||||
public static function EnableCKEditor5ImageUpload(DBObject $oObject, $sTempId){
|
||||
return <<<JS
|
||||
// Hook the file upload of all CKEditor instances
|
||||
JS;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -542,32 +542,32 @@ class FileLog
|
||||
*/
|
||||
class LogChannels
|
||||
{
|
||||
public const APC = 'apc';
|
||||
public const APC = 'Apc';
|
||||
|
||||
/**
|
||||
* @var string Everything related to the backup / restore
|
||||
* @since 3.1.0
|
||||
*/
|
||||
public const BACKUP = 'backup';
|
||||
public const BACKUP = 'Backup';
|
||||
|
||||
/**
|
||||
* @since 3.0.0
|
||||
*/
|
||||
public const CLI = 'CLI';
|
||||
public const CLI = 'Cli';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
* @since 2.7.7 N°4558 use this new channel when logging DB transactions
|
||||
* @since 3.0.0 logs info in CMDBSource (see commit a117906f)
|
||||
*/
|
||||
public const CMDB_SOURCE = 'cmdbsource';
|
||||
public const CMDB_SOURCE = 'CmdbSource';
|
||||
|
||||
/**
|
||||
* @since 3.0.0
|
||||
*/
|
||||
public const CONSOLE = 'console';
|
||||
public const CONSOLE = 'Console';
|
||||
|
||||
public const CORE = 'core';
|
||||
public const CORE = 'Core';
|
||||
|
||||
/**
|
||||
* @var string Everything related to the datatable component
|
||||
@@ -592,10 +592,10 @@ class LogChannels
|
||||
* @var string Everything related to the datamodel CRUD
|
||||
* @since 3.1.0
|
||||
*/
|
||||
public const DM_CRUD = 'DMCRUD';
|
||||
public const DM_CRUD = 'DMCrud';
|
||||
|
||||
/**
|
||||
* @var string Everything related to the datamodel CRUD
|
||||
* @var string Everything related to webrequests
|
||||
* @since 3.1.0
|
||||
*/
|
||||
public const WEB_REQUEST = 'WebRequest';
|
||||
@@ -610,7 +610,7 @@ class LogChannels
|
||||
* @var string
|
||||
* @since 2.7.9 3.0.3 3.1.0 N°5588
|
||||
*/
|
||||
public const EXPORT = 'export';
|
||||
public const EXPORT = 'Export';
|
||||
|
||||
public const INLINE_IMAGE = 'InlineImage';
|
||||
|
||||
@@ -619,9 +619,9 @@ class LogChannels
|
||||
* @since 3.0.1 N°4849
|
||||
* @since 2.7.7 N°4635
|
||||
*/
|
||||
public const NOTIFICATIONS = 'notifications';
|
||||
public const NOTIFICATIONS = 'Notifications';
|
||||
|
||||
public const PORTAL = 'portal';
|
||||
public const PORTAL = 'Portal';
|
||||
|
||||
public const TEMPORARY_OBJECTS = 'TemporaryObjects';
|
||||
|
||||
@@ -629,7 +629,13 @@ class LogChannels
|
||||
* @var string
|
||||
* @since 3.1.0
|
||||
*/
|
||||
public const ROUTER = 'router';
|
||||
public const ROUTER = 'Router';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
* @since 3.2.0
|
||||
*/
|
||||
public const SECURITY = 'Security';
|
||||
}
|
||||
|
||||
|
||||
@@ -1167,7 +1173,7 @@ class DeprecatedCallsLog extends LogAPI
|
||||
|
||||
/**
|
||||
* This will catch a message for all E_DEPRECATED and E_USER_DEPRECATED errors.
|
||||
* This handler is set in DeprecatedCallsLog::Enable
|
||||
* This handler is set in {@see DeprecatedCallsLog::Enable}
|
||||
*
|
||||
* @param int $errno
|
||||
* @param string $errstr
|
||||
@@ -1187,52 +1193,22 @@ class DeprecatedCallsLog extends LogAPI
|
||||
return false;
|
||||
}
|
||||
|
||||
$aStack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 4);
|
||||
if (isset($aStack[2]['function']) && ($aStack[2]['function'] == 'ForwardToTriggerError')) {
|
||||
// Let the notice bubble up
|
||||
return false;
|
||||
}
|
||||
|
||||
if (false === static::IsLogLevelEnabledSafe(self::LEVEL_WARNING, self::ENUM_CHANNEL_PHP_LIBMETHOD)) {
|
||||
// returns true so that nothing is throwned !
|
||||
// returns true so that nothing is thrown!
|
||||
return true;
|
||||
}
|
||||
|
||||
$aStack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 4);
|
||||
$iStackDeprecatedMethodLevel = 2; // level 0 = current method, level 1 = @trigger_error, level 2 = method containing the `trigger_error` call (can be either 'trigger_deprecation' or the faulty method), level 3 = In some cases, method containing the 'trigger_deprecation' call
|
||||
// In case current level is actually a 'trigger_deprecation' call, try to go one level further to get the real deprecated method
|
||||
if (array_key_exists($iStackDeprecatedMethodLevel, $aStack) && ($aStack[$iStackDeprecatedMethodLevel]['function'] === 'trigger_deprecation') && array_key_exists($iStackDeprecatedMethodLevel + 1, $aStack)) {
|
||||
$iStackDeprecatedMethodLevel++;
|
||||
}
|
||||
|
||||
$sDeprecatedObject = $aStack[$iStackDeprecatedMethodLevel]['class'];
|
||||
$sDeprecatedMethod = $aStack[$iStackDeprecatedMethodLevel]['function'];
|
||||
if (($sDeprecatedObject === __CLASS__) && ($sDeprecatedMethod === 'Log')) {
|
||||
// We are generating a trigger_error ourselves, we don't want to trace them !
|
||||
return false;
|
||||
}
|
||||
$sCallerFile = $aStack[$iStackDeprecatedMethodLevel]['file'];
|
||||
$sCallerLine = $aStack[$iStackDeprecatedMethodLevel]['line'];
|
||||
$sMessage = "Call to {$sDeprecatedObject}::{$sDeprecatedMethod} in {$sCallerFile}#L{$sCallerLine}";
|
||||
|
||||
$iStackCallerMethodLevel = $iStackDeprecatedMethodLevel + 1; // level 3 = caller of the deprecated method
|
||||
if (array_key_exists($iStackCallerMethodLevel, $aStack)) {
|
||||
$sCallerObject = $aStack[$iStackCallerMethodLevel]['class'] ?? null;
|
||||
$sCallerMethod = $aStack[$iStackCallerMethodLevel]['function'] ?? null;
|
||||
$sMessage .= ' (';
|
||||
if (!is_null($sCallerObject)) {
|
||||
$sMessage .= "{$sCallerObject}::{$sCallerMethod}";
|
||||
} else {
|
||||
$sCallerMethodFile = $aStack[$iStackCallerMethodLevel]['file'];
|
||||
$sCallerMethodLine = $aStack[$iStackCallerMethodLevel]['line'];
|
||||
if (!is_null($sCallerMethod)) {
|
||||
$sMessage .= "call to {$sCallerMethod}() in {$sCallerMethodFile}#L{$sCallerMethodLine}";
|
||||
} else {
|
||||
$sMessage .= "{$sCallerMethodFile}#L{$sCallerMethodLine}";
|
||||
}
|
||||
}
|
||||
$sMessage .= ')';
|
||||
}
|
||||
|
||||
if (!empty($errstr)) {
|
||||
$sMessage .= ' : '.$errstr;
|
||||
}
|
||||
$aStack = static::StripCallStack($aStack);
|
||||
$sMessage = "$errstr, called from ".static::SummarizeCallStack($aStack);
|
||||
|
||||
static::Warning($sMessage, self::ENUM_CHANNEL_PHP_LIBMETHOD);
|
||||
static::ForwardToTriggerError($sMessage);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1258,6 +1234,8 @@ class DeprecatedCallsLog extends LogAPI
|
||||
}
|
||||
|
||||
/**
|
||||
* Call this helper at the beginning of a deprecated file (in its global scope)
|
||||
*
|
||||
* @since 3.0.1 3.1.0 N°4725 silently handles ConfigException
|
||||
* @since 3.0.4 3.1.0 N°4725 remove forgotten throw PHPDoc annotation
|
||||
*
|
||||
@@ -1292,9 +1270,12 @@ class DeprecatedCallsLog extends LogAPI
|
||||
}
|
||||
|
||||
static::Warning($sMessage, static::ENUM_CHANNEL_FILE);
|
||||
static::ForwardToTriggerError($sMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Call this helper when calling a deprecated extension method
|
||||
*
|
||||
* @param string $sImplementationClass Class implementing the deprecated API
|
||||
* @param string $sDeprecatedApi Class name of the deprecated API
|
||||
* @param string $sDeprecatedMethod Method name of the deprecated API
|
||||
@@ -1321,9 +1302,12 @@ class DeprecatedCallsLog extends LogAPI
|
||||
}
|
||||
|
||||
static::Warning($sMessage, self::ENUM_CHANNEL_PHP_API);
|
||||
static::ForwardToTriggerError($sMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Call this helper within deprecated methods
|
||||
*
|
||||
* @param string|null $sAdditionalMessage
|
||||
*
|
||||
* @link https://www.php.net/debug_backtrace
|
||||
@@ -1341,52 +1325,24 @@ class DeprecatedCallsLog extends LogAPI
|
||||
}
|
||||
|
||||
$aStack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3);
|
||||
$sMessage = self::GetMessageFromStack($aStack);
|
||||
|
||||
if (!is_null($sAdditionalMessage)) {
|
||||
$sMessage .= ' : '.$sAdditionalMessage;
|
||||
if (isset($aStack[1]['class'])) {
|
||||
$sFunctionDesc = $aStack[1]['class'].$aStack[1]['type'].$aStack[1]['function'];
|
||||
}
|
||||
else {
|
||||
$sFunctionDesc = $aStack[1]['function'];
|
||||
}
|
||||
|
||||
$sMessage = "Function $sFunctionDesc() is deprecated";
|
||||
if (!is_null($sAdditionalMessage)) {
|
||||
$sMessage .= ': '.$sAdditionalMessage;
|
||||
}
|
||||
|
||||
$sMessage .= '. Caller: '.self::SummarizeCallStack(array_slice($aStack, 1));
|
||||
|
||||
|
||||
static::Warning($sMessage, self::ENUM_CHANNEL_PHP_METHOD);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $aDebugBacktrace data from {@see debug_backtrace()}
|
||||
*
|
||||
* @return string message to print to the log
|
||||
*/
|
||||
private static function GetMessageFromStack(array $aDebugBacktrace): string
|
||||
{
|
||||
// level 0 = current method
|
||||
// level 1 = deprecated method, containing the `NotifyDeprecatedPhpMethod` call
|
||||
$sMessage = 'Call'.self::GetMessageForCurrentStackLevel($aDebugBacktrace[1], " to ");
|
||||
|
||||
// level 2 = caller of the deprecated method
|
||||
if (array_key_exists(2, $aDebugBacktrace)) {
|
||||
$sMessage .= ' (from ';
|
||||
$sMessage .= self::GetMessageForCurrentStackLevel($aDebugBacktrace[2]);
|
||||
$sMessage .= ')';
|
||||
}
|
||||
|
||||
return $sMessage;
|
||||
}
|
||||
|
||||
private static function GetMessageForCurrentStackLevel(array $aCurrentLevelDebugTrace, ?string $sPrefix = ""): string
|
||||
{
|
||||
$sMessage = "";
|
||||
if (array_key_exists('class', $aCurrentLevelDebugTrace)) {
|
||||
$sDeprecatedObject = $aCurrentLevelDebugTrace['class'];
|
||||
$sDeprecatedMethod = $aCurrentLevelDebugTrace['function'] ?? "";
|
||||
$sMessage = "{$sPrefix}{$sDeprecatedObject}::{$sDeprecatedMethod} in ";
|
||||
}
|
||||
|
||||
if (array_key_exists('file', $aCurrentLevelDebugTrace)) {
|
||||
$sCallerFile = $aCurrentLevelDebugTrace['file'];
|
||||
$sCallerLine = $aCurrentLevelDebugTrace['line'] ?? "";
|
||||
$sMessage .= "{$sCallerFile}#L{$sCallerLine}";
|
||||
}
|
||||
|
||||
return $sMessage;
|
||||
static::ForwardToTriggerError($sMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1416,14 +1372,11 @@ class DeprecatedCallsLog extends LogAPI
|
||||
}
|
||||
|
||||
static::Warning($sMessage, self::ENUM_CHANNEL_PHP_ENDPOINT);
|
||||
static::ForwardToTriggerError($sMessage);
|
||||
}
|
||||
|
||||
public static function Log($sLevel, $sMessage, $sChannel = null, $aContext = array()): void
|
||||
{
|
||||
if (true === utils::IsDevelopmentEnvironment()) {
|
||||
trigger_error($sMessage, E_USER_DEPRECATED);
|
||||
}
|
||||
|
||||
try {
|
||||
parent::Log($sLevel, $sMessage, $sChannel, $aContext);
|
||||
}
|
||||
@@ -1431,6 +1384,61 @@ class DeprecatedCallsLog extends LogAPI
|
||||
// nothing much we can do... and we don't want to crash the caller !
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Strips some elements from the top of the call stack to skip calls that are not relevant to report the deprecated call
|
||||
* @param array $aCallStack Call stack as returned by {@see debug_backtrace()}
|
||||
*/
|
||||
protected static function StripCallStack($aCallStack): array
|
||||
{
|
||||
if (!isset($aCallStack[0]['line'])) {
|
||||
$aCallStack = array_slice($aCallStack, 1);
|
||||
}
|
||||
if (isset($aCallStack[1]['function']) && $aCallStack[1]['function'] === 'trigger_deprecation') {
|
||||
$aCallStack = array_slice($aCallStack, 1);
|
||||
}
|
||||
|
||||
return $aCallStack;
|
||||
}
|
||||
|
||||
protected static function SummarizeCallStack($aCallStack, $bRecurse = true)
|
||||
{
|
||||
if (count($aCallStack) == 0) {
|
||||
return null;
|
||||
}
|
||||
$sFileLine = $aCallStack[0]['file'].'#'.$aCallStack[0]['line'];
|
||||
$sSummary = $sFileLine;
|
||||
|
||||
// If possible and meaningful, add the class and method
|
||||
if (isset($aCallStack[1]['class'])) {
|
||||
$sSummary = $aCallStack[1]['class'].$aCallStack[1]['type'].$aCallStack[1]['function']." ($sFileLine)";
|
||||
}
|
||||
elseif (isset($aCallStack[1]['function'])) {
|
||||
if (in_array($aCallStack[1]['function'], ['include', 'require', 'include_once', 'require_once'])) {
|
||||
// No need to show the generic mechanism of inclusion
|
||||
$bRecurse = false;
|
||||
}
|
||||
else {
|
||||
$sSummary = $aCallStack[1]['function']." ($sFileLine)";
|
||||
}
|
||||
}
|
||||
|
||||
if ($bRecurse) {
|
||||
$sUpperSummary = static::SummarizeCallStack(array_slice($aCallStack, 1), false);
|
||||
if (!is_null($sUpperSummary)) {
|
||||
$sSummary .= ', itself called from '.$sUpperSummary;
|
||||
}
|
||||
}
|
||||
|
||||
return $sSummary;
|
||||
}
|
||||
|
||||
private static function ForwardToTriggerError(string $sMessage): void
|
||||
{
|
||||
if (true === utils::IsDevelopmentEnvironment()) {
|
||||
trigger_error($sMessage, E_USER_DEPRECATED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -6873,6 +6873,9 @@ abstract class MetaModel
|
||||
/**
|
||||
* Instantiate an object already persisted to the Database.
|
||||
*
|
||||
* Note that LinkedSet attributes are not loaded.
|
||||
* DBObject::Reload() will be called when getting a LinkedSet attribute
|
||||
*
|
||||
* @api
|
||||
* @see MetaModel::GetObjectWithArchive to get object even if it's archived
|
||||
* @see utils::PushArchiveMode() to enable search on archived objects
|
||||
@@ -7474,6 +7477,8 @@ abstract class MetaModel
|
||||
* @param string|null $sFilterInstanceOf [optional] if given, only instance of this string will be returned
|
||||
*
|
||||
* @return array classes=>instance implementing the given interface
|
||||
*
|
||||
* @see \Combodo\iTop\Service\InterfaceDiscovery\InterfaceDiscovery::FindItopClasses() to add extensibility to modules
|
||||
*/
|
||||
public static function EnumPlugins($sInterface, $sFilterInstanceOf = null)
|
||||
{
|
||||
|
||||
@@ -33,17 +33,19 @@ class ParseyyToken implements ArrayAccess
|
||||
return $this->string;
|
||||
}
|
||||
|
||||
function offsetExists($offset)
|
||||
function offsetExists($offset): bool
|
||||
{
|
||||
return isset($this->metadata[$offset]);
|
||||
}
|
||||
|
||||
function offsetGet($offset)
|
||||
// Return type mixed is not supported by PHP 7.4, we can remove the following PHP attribute and add the return type once iTop min PHP version is PHP 8.0+
|
||||
#[\ReturnTypeWillChange]
|
||||
function offsetGet($offset)
|
||||
{
|
||||
return $this->metadata[$offset];
|
||||
}
|
||||
|
||||
function offsetSet($offset, $value)
|
||||
function offsetSet($offset, $value): void
|
||||
{
|
||||
if ($offset === null) {
|
||||
if (isset($value[0])) {
|
||||
@@ -66,7 +68,7 @@ class ParseyyToken implements ArrayAccess
|
||||
}
|
||||
}
|
||||
|
||||
function offsetUnset($offset)
|
||||
function offsetUnset($offset): void
|
||||
{
|
||||
unset($this->metadata[$offset]);
|
||||
}
|
||||
|
||||
@@ -182,14 +182,14 @@ class PHP_LexerGenerator_Lexer
|
||||
$this->token = self::COMMENTEND;
|
||||
return true;
|
||||
}
|
||||
if (preg_match('/\G%([a-z]+)/', $this->data, $token, null, $this->N)) {
|
||||
if (preg_match('/\G%([a-z]+)/', $this->data, $token, 0, $this->N)) {
|
||||
$this->value = $token[1];
|
||||
$this->N += strlen($token[1]) + 1;
|
||||
$this->state = 'DeclarePI';
|
||||
$this->token = self::PI;
|
||||
return true;
|
||||
}
|
||||
if (preg_match('/\G[a-zA-Z_][a-zA-Z0-9_]*/', $this->data, $token, null, $this->N)) {
|
||||
if (preg_match('/\G[a-zA-Z_][a-zA-Z0-9_]*/', $this->data, $token, 0, $this->N)) {
|
||||
$this->value = $token[0];
|
||||
$this->token = self::PATTERN;
|
||||
$this->N += strlen($token[0]);
|
||||
@@ -216,7 +216,7 @@ class PHP_LexerGenerator_Lexer
|
||||
if ($this->data[$this->N] == '{') {
|
||||
return $this->lexCode();
|
||||
}
|
||||
if (!preg_match("/\G[^\n]+/", $this->data, $token, null, $this->N)) {
|
||||
if (!preg_match("/\G[^\n]+/", $this->data, $token, 0, $this->N)) {
|
||||
$this->error('Unexpected end of file');
|
||||
return false;
|
||||
}
|
||||
@@ -242,7 +242,7 @@ class PHP_LexerGenerator_Lexer
|
||||
if ($this->data[$this->N] == '{') {
|
||||
return $this->lexCode();
|
||||
}
|
||||
if (!preg_match("/\G[^\n]+/", $this->data, $token, null, $this->N)) {
|
||||
if (!preg_match("/\G[^\n]+/", $this->data, $token, 0, $this->N)) {
|
||||
$this->error('Unexpected end of file');
|
||||
return false;
|
||||
}
|
||||
@@ -406,7 +406,7 @@ class PHP_LexerGenerator_Lexer
|
||||
if ($this->data[$this->N] == '\'') {
|
||||
return $this->lexQuote('\'');
|
||||
}
|
||||
if (preg_match('/\G%([a-zA-Z_]+)/', $this->data, $token, null, $this->N)) {
|
||||
if (preg_match('/\G%([a-zA-Z_]+)/', $this->data, $token, 0, $this->N)) {
|
||||
$this->value = $token[1];
|
||||
$this->N += strlen($token[1]) + 1;
|
||||
$this->state = 'DeclarePIRule';
|
||||
@@ -419,7 +419,7 @@ class PHP_LexerGenerator_Lexer
|
||||
if ($this->data[$this->N] == '"') {
|
||||
return $this->lexQuote();
|
||||
}
|
||||
if (preg_match('/\G[a-zA-Z_][a-zA-Z0-9_]*/', $this->data, $token, null, $this->N)) {
|
||||
if (preg_match('/\G[a-zA-Z_][a-zA-Z0-9_]*/', $this->data, $token, 0, $this->N)) {
|
||||
$this->value = $token[0];
|
||||
$this->N += strlen($token[0]);
|
||||
$this->token = self::SUBPATTERN;
|
||||
|
||||
@@ -33,17 +33,19 @@ class PHP_LexerGenerator_ParseryyToken implements ArrayAccess
|
||||
return $this->_string;
|
||||
}
|
||||
|
||||
function offsetExists($offset)
|
||||
function offsetExists($offset): bool
|
||||
{
|
||||
return isset($this->metadata[$offset]);
|
||||
}
|
||||
|
||||
// Return type mixed is not supported by PHP 7.4, we can remove the following PHP attribute and add the return type once iTop min PHP version is PHP 8.0+
|
||||
#[\ReturnTypeWillChange]
|
||||
function offsetGet($offset)
|
||||
{
|
||||
return $this->metadata[$offset];
|
||||
}
|
||||
|
||||
function offsetSet($offset, $value)
|
||||
function offsetSet($offset, $value): void
|
||||
{
|
||||
if ($offset === null) {
|
||||
if (isset($value[0])) {
|
||||
@@ -66,7 +68,7 @@ class PHP_LexerGenerator_ParseryyToken implements ArrayAccess
|
||||
}
|
||||
}
|
||||
|
||||
function offsetUnset($offset)
|
||||
function offsetUnset($offset): void
|
||||
{
|
||||
unset($this->metadata[$offset]);
|
||||
}
|
||||
@@ -278,7 +280,7 @@ class PHP_LexerGenerator_Parser#line 171 "Parser.php"
|
||||
$match = false;
|
||||
foreach ($yy_yymore_patterns[' . $this->token . '] as $index => $rule) {
|
||||
if (preg_match(\'/\' . $rule . \'/' . $this->patternFlags . '\',
|
||||
' . $this->input . ', $yymatches, null, ' . $this->counter . ')) {
|
||||
' . $this->input . ', $yymatches, 0, ' . $this->counter . ')) {
|
||||
$yymatches = array_filter($yymatches, \'strlen\'); // remove empty sub-patterns
|
||||
if ($match) {
|
||||
if (strlen($yymatches[0]) > strlen($match[0][0])) {
|
||||
@@ -350,7 +352,7 @@ class PHP_LexerGenerator_Parser#line 171 "Parser.php"
|
||||
$pattern . '\';' . "\n");
|
||||
fwrite($this->out, '
|
||||
do {
|
||||
if (preg_match($yy_global_pattern,' . $this->input . ', $yymatches, null, ' .
|
||||
if (preg_match($yy_global_pattern,' . $this->input . ', $yymatches, 0, ' .
|
||||
$this->counter .
|
||||
')) {
|
||||
$yysubmatches = $yymatches;
|
||||
@@ -408,7 +410,7 @@ class PHP_LexerGenerator_Parser#line 171 "Parser.php"
|
||||
}
|
||||
$yysubmatches = array();
|
||||
if (preg_match(\'/\' . $yy_yymore_patterns[' . $this->token . '][1] . \'/' . $this->patternFlags . '\',
|
||||
' . $this->input . ', $yymatches, null, ' . $this->counter .')) {
|
||||
' . $this->input . ', $yymatches, 0, ' . $this->counter .')) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, \'strlen\'); // remove empty sub-patterns
|
||||
next($yymatches); // skip global match
|
||||
|
||||
@@ -187,7 +187,7 @@ require_once 'PHP/LexerGenerator/Exception.php';
|
||||
$match = false;
|
||||
foreach ($yy_yymore_patterns[' . $this->token . '] as $index => $rule) {
|
||||
if (preg_match(\'/\' . $rule . \'/' . $this->patternFlags . '\',
|
||||
' . $this->input . ', $yymatches, null, ' . $this->counter . ')) {
|
||||
' . $this->input . ', $yymatches, 0, ' . $this->counter . ')) {
|
||||
$yymatches = array_filter($yymatches, \'strlen\'); // remove empty sub-patterns
|
||||
if ($match) {
|
||||
if (strlen($yymatches[0]) > strlen($match[0][0])) {
|
||||
@@ -259,7 +259,7 @@ require_once 'PHP/LexerGenerator/Exception.php';
|
||||
$pattern . '\';' . "\n");
|
||||
fwrite($this->out, '
|
||||
do {
|
||||
if (preg_match($yy_global_pattern,' . $this->input . ', $yymatches, null, ' .
|
||||
if (preg_match($yy_global_pattern,' . $this->input . ', $yymatches, 0, ' .
|
||||
$this->counter .
|
||||
')) {
|
||||
$yysubmatches = $yymatches;
|
||||
@@ -317,7 +317,7 @@ require_once 'PHP/LexerGenerator/Exception.php';
|
||||
}
|
||||
$yysubmatches = array();
|
||||
if (preg_match(\'/\' . $yy_yymore_patterns[' . $this->token . '][1] . \'/' . $this->patternFlags . '\',
|
||||
' . $this->input . ', $yymatches, null, ' . $this->counter .')) {
|
||||
' . $this->input . ', $yymatches, 0, ' . $this->counter .')) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, \'strlen\'); // remove empty sub-patterns
|
||||
next($yymatches); // skip global match
|
||||
|
||||
@@ -110,7 +110,7 @@ class PHP_LexerGenerator_Regex_Lexer
|
||||
$yy_global_pattern = '/\G(\\\\\\\\)|\G([^[\\\\^$.|()?*+{}]+)|\G(\\\\[][{}*.^$|?()+])|\G(\\[)|\G(\\|)|\G(\\\\[frnt]|\\\\x[0-9a-fA-F][0-9a-fA-F]?|\\\\[0-7][0-7][0-7]|\\\\x\\{[0-9a-fA-F]+\\})|\G(\\\\[0-9][0-9])|\G(\\\\[abBGcedDsSwW0C]|\\\\c\\\\)|\G(\\^)|\G(\\\\A)|\G(\\))|\G(\\$)|\G(\\*\\?|\\+\\?|[*?+]|\\{[0-9]+\\}|\\{[0-9]+,\\}|\\{[0-9]+,[0-9]+\\})|\G(\\\\[zZ])|\G(\\(\\?)|\G(\\()|\G(\\.)|\G(\\\\[1-9])|\G(\\\\p\\{\\^?..?\\}|\\\\P\\{..?\\}|\\\\X)|\G(\\\\p\\{C[cfnos]?|L[lmotu]?|M[cen]?|N[dlo]?|P[cdefios]?|S[ckmo]?|Z[lps]?\\})|\G(\\\\p\\{\\^C[cfnos]?|L[lmotu]?|M[cen]?|N[dlo]?|P[cdefios]?|S[ckmo]?|Z[lps]?\\})|\G(\\\\p[CLMNPSZ])|\G(\\\\)/';
|
||||
|
||||
do {
|
||||
if (preg_match($yy_global_pattern,$this->input, $yymatches, null, $this->N)) {
|
||||
if (preg_match($yy_global_pattern,$this->input, $yymatches, 0, $this->N)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
if (!count($yymatches)) {
|
||||
@@ -180,7 +180,7 @@ class PHP_LexerGenerator_Regex_Lexer
|
||||
}
|
||||
$yysubmatches = array();
|
||||
if (preg_match('/' . $yy_yymore_patterns[$this->token][1] . '/',
|
||||
$this->input, $yymatches, null, $this->N)) {
|
||||
$this->input, $yymatches, 0, $this->N)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
next($yymatches); // skip global match
|
||||
@@ -360,7 +360,7 @@ class PHP_LexerGenerator_Regex_Lexer
|
||||
$yy_global_pattern = '/\G(\\^)|\G(\\])|\G(.)/';
|
||||
|
||||
do {
|
||||
if (preg_match($yy_global_pattern,$this->input, $yymatches, null, $this->N)) {
|
||||
if (preg_match($yy_global_pattern,$this->input, $yymatches, 0, $this->N)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
if (!count($yymatches)) {
|
||||
@@ -410,7 +410,7 @@ class PHP_LexerGenerator_Regex_Lexer
|
||||
}
|
||||
$yysubmatches = array();
|
||||
if (preg_match('/' . $yy_yymore_patterns[$this->token][1] . '/',
|
||||
$this->input, $yymatches, null, $this->N)) {
|
||||
$this->input, $yymatches, 0, $this->N)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
next($yymatches); // skip global match
|
||||
@@ -497,7 +497,7 @@ class PHP_LexerGenerator_Regex_Lexer
|
||||
$yy_global_pattern = '/\G(\\\\\\\\)|\G(\\])|\G(\\\\[frnt]|\\\\x[0-9a-fA-F][0-9a-fA-F]?|\\\\[0-7][0-7][0-7]|\\\\x\\{[0-9a-fA-F]+\\})|\G(\\\\[bacedDsSwW0C]|\\\\c\\\\|\\\\x\\{[0-9a-fA-F]+\\}|\\\\[0-7][0-7][0-7]|\\\\x[0-9a-fA-F][0-9a-fA-F]?)|\G(\\\\[0-9][0-9])|\G(\\\\[1-9])|\G(\\\\[]\.\-\^])|\G(-(?!]))|\G([^\-\\\\])|\G(\\\\)|\G(.)/';
|
||||
|
||||
do {
|
||||
if (preg_match($yy_global_pattern,$this->input, $yymatches, null, $this->N)) {
|
||||
if (preg_match($yy_global_pattern,$this->input, $yymatches, 0, $this->N)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
if (!count($yymatches)) {
|
||||
@@ -555,7 +555,7 @@ class PHP_LexerGenerator_Regex_Lexer
|
||||
}
|
||||
$yysubmatches = array();
|
||||
if (preg_match('/' . $yy_yymore_patterns[$this->token][1] . '/',
|
||||
$this->input, $yymatches, null, $this->N)) {
|
||||
$this->input, $yymatches, 0, $this->N)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
next($yymatches); // skip global match
|
||||
@@ -678,7 +678,7 @@ class PHP_LexerGenerator_Regex_Lexer
|
||||
$yy_global_pattern = '/\G(\\\\\\\\)|\G(\\\\\\])|\G(\\\\[bacedDsSwW0C]|\\\\c\\\\|\\\\x\\{[0-9a-fA-F]+\\}|\\\\[0-7][0-7][0-7]|\\\\x[0-9a-fA-F][0-9a-fA-F]?)|\G(\\\\[0-9][0-9])|\G(\\\\[1-9])|\G([^\-\\\\])|\G(\\\\)/';
|
||||
|
||||
do {
|
||||
if (preg_match($yy_global_pattern,$this->input, $yymatches, null, $this->N)) {
|
||||
if (preg_match($yy_global_pattern,$this->input, $yymatches, 0, $this->N)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
if (!count($yymatches)) {
|
||||
@@ -732,7 +732,7 @@ class PHP_LexerGenerator_Regex_Lexer
|
||||
}
|
||||
$yysubmatches = array();
|
||||
if (preg_match('/' . $yy_yymore_patterns[$this->token][1] . '/',
|
||||
$this->input, $yymatches, null, $this->N)) {
|
||||
$this->input, $yymatches, 0, $this->N)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
next($yymatches); // skip global match
|
||||
@@ -842,7 +842,7 @@ class PHP_LexerGenerator_Regex_Lexer
|
||||
$yy_global_pattern = '/\G([imsxUX]+-[imsxUX]+|[imsxUX]+|-[imsxUX]+)|\G(:)|\G(\\))|\G(P<[^>]+>)|\G(<=)|\G(<!)|\G(=)|\G(!)|\G(>)|\G(\\(\\?)|\G(#[^)]+)|\G(R)|\G(.)/';
|
||||
|
||||
do {
|
||||
if (preg_match($yy_global_pattern,$this->input, $yymatches, null, $this->N)) {
|
||||
if (preg_match($yy_global_pattern,$this->input, $yymatches, 0, $this->N)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
if (!count($yymatches)) {
|
||||
@@ -902,7 +902,7 @@ class PHP_LexerGenerator_Regex_Lexer
|
||||
}
|
||||
$yysubmatches = array();
|
||||
if (preg_match('/' . $yy_yymore_patterns[$this->token][1] . '/',
|
||||
$this->input, $yymatches, null, $this->N)) {
|
||||
$this->input, $yymatches, 0, $this->N)) {
|
||||
$yysubmatches = $yymatches;
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
next($yymatches); // skip global match
|
||||
|
||||
@@ -33,17 +33,19 @@ class PHP_LexerGenerator_Regex_yyToken implements ArrayAccess
|
||||
return $this->_string;
|
||||
}
|
||||
|
||||
function offsetExists($offset)
|
||||
function offsetExists($offset): bool
|
||||
{
|
||||
return isset($this->metadata[$offset]);
|
||||
}
|
||||
|
||||
// Return type mixed is not supported by PHP 7.4, we can remove the following PHP attribute and add the return type once iTop min PHP version is PHP 8.0+
|
||||
#[\ReturnTypeWillChange]
|
||||
function offsetGet($offset)
|
||||
{
|
||||
return $this->metadata[$offset];
|
||||
}
|
||||
|
||||
function offsetSet($offset, $value)
|
||||
function offsetSet($offset, $value): void
|
||||
{
|
||||
if ($offset === null) {
|
||||
if (isset($value[0])) {
|
||||
@@ -66,7 +68,7 @@ class PHP_LexerGenerator_Regex_yyToken implements ArrayAccess
|
||||
}
|
||||
}
|
||||
|
||||
function offsetUnset($offset)
|
||||
function offsetUnset($offset): void
|
||||
{
|
||||
unset($this->metadata[$offset]);
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#
|
||||
# Rebuild the iTop Lexer / Parser
|
||||
# PEAR is required to build (really?)
|
||||
# PHP 8.0+ is not supported by the parser generator
|
||||
# Launch this batch from the core/oql/build directory
|
||||
# with ./build.bash
|
||||
#
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
rem must be run with current directory = the directory of the batch
|
||||
rem PEAR is required to build
|
||||
rem PHP 8.0+ is not supported by the parser generator
|
||||
php -d include_path=".;C:\iTop\PHP\PEAR" ".\PHP\LexerGenerator\cli.php" ..\oql-lexer.plex
|
||||
php ".\PHP\ParserGenerator\cli.php" ..\oql-parser.y
|
||||
php -r "echo date('Y-m-d');" > ..\version.txt
|
||||
|
||||
@@ -235,7 +235,7 @@ class OQLLexerRaw
|
||||
$match = false;
|
||||
foreach ($yy_yymore_patterns[$this->token] as $index => $rule) {
|
||||
if (preg_match('/' . $rule . '/',
|
||||
$this->data, $yymatches, null, $this->count)) {
|
||||
$this->data, $yymatches, 0, $this->count)) {
|
||||
$yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
|
||||
if ($match) {
|
||||
if (strlen($yymatches[0]) > strlen($match[0][0])) {
|
||||
|
||||
@@ -40,7 +40,7 @@ class OQLParser_yyToken implements ArrayAccess
|
||||
|
||||
// Return type mixed is not supported by PHP 7.4, we can remove the following PHP attribute and add the return type once iTop min PHP version is PHP 8.0+
|
||||
#[\ReturnTypeWillChange]
|
||||
function offsetGet($offset)
|
||||
function offsetGet($offset)
|
||||
{
|
||||
return $this->metadata[$offset];
|
||||
}
|
||||
@@ -99,7 +99,7 @@ class OQLParser_yyStackEntry
|
||||
|
||||
// declare_class is output here
|
||||
#line 24 "..\oql-parser.y"
|
||||
class OQLParserRaw#line 102 "..\oql-parser.php"
|
||||
class OQLParserRaw#line 104 "..\oql-parser.php"
|
||||
{
|
||||
/* First off, code is included which follows the "include_class" declaration
|
||||
** in the input file. */
|
||||
@@ -1180,7 +1180,7 @@ static public $yy_action = array(
|
||||
#line 30 "..\oql-parser.y"
|
||||
|
||||
throw new OQLParserStackOverFlowException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol);
|
||||
#line 1186 "..\oql-parser.php"
|
||||
#line 1188 "..\oql-parser.php"
|
||||
return;
|
||||
}
|
||||
$yytos = new OQLParser_yyStackEntry;
|
||||
@@ -1482,49 +1482,49 @@ throw new OQLParserStackOverFlowException($this->m_sSourceQuery, $this->m_iLine,
|
||||
*/
|
||||
#line 37 "..\oql-parser.y"
|
||||
function yy_r0(){ $this->my_result = $this->yystack[$this->yyidx + 0]->minor; }
|
||||
#line 1488 "..\oql-parser.php"
|
||||
#line 1490 "..\oql-parser.php"
|
||||
#line 41 "..\oql-parser.y"
|
||||
function yy_r3(){
|
||||
$this->_retvalue = new OqlUnionQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
#line 1493 "..\oql-parser.php"
|
||||
#line 1495 "..\oql-parser.php"
|
||||
#line 48 "..\oql-parser.y"
|
||||
function yy_r5(){
|
||||
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, array($this->yystack[$this->yyidx + -2]->minor));
|
||||
}
|
||||
#line 1498 "..\oql-parser.php"
|
||||
#line 1500 "..\oql-parser.php"
|
||||
#line 51 "..\oql-parser.y"
|
||||
function yy_r6(){
|
||||
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, array($this->yystack[$this->yyidx + -2]->minor));
|
||||
}
|
||||
#line 1503 "..\oql-parser.php"
|
||||
#line 1505 "..\oql-parser.php"
|
||||
#line 55 "..\oql-parser.y"
|
||||
function yy_r7(){
|
||||
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -4]->minor);
|
||||
}
|
||||
#line 1508 "..\oql-parser.php"
|
||||
#line 1510 "..\oql-parser.php"
|
||||
#line 58 "..\oql-parser.y"
|
||||
function yy_r8(){
|
||||
$this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -6]->minor);
|
||||
}
|
||||
#line 1513 "..\oql-parser.php"
|
||||
#line 1515 "..\oql-parser.php"
|
||||
#line 63 "..\oql-parser.y"
|
||||
function yy_r9(){
|
||||
$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
#line 1518 "..\oql-parser.php"
|
||||
#line 1520 "..\oql-parser.php"
|
||||
#line 66 "..\oql-parser.y"
|
||||
function yy_r10(){
|
||||
array_push($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor;
|
||||
}
|
||||
#line 1524 "..\oql-parser.php"
|
||||
#line 1526 "..\oql-parser.php"
|
||||
#line 71 "..\oql-parser.y"
|
||||
function yy_r11(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; }
|
||||
#line 1527 "..\oql-parser.php"
|
||||
#line 1529 "..\oql-parser.php"
|
||||
#line 72 "..\oql-parser.y"
|
||||
function yy_r12(){ $this->_retvalue = null; }
|
||||
#line 1530 "..\oql-parser.php"
|
||||
#line 1532 "..\oql-parser.php"
|
||||
#line 74 "..\oql-parser.y"
|
||||
function yy_r13(){
|
||||
// insert the join statement on top of the existing list
|
||||
@@ -1532,63 +1532,63 @@ throw new OQLParserStackOverFlowException($this->m_sSourceQuery, $this->m_iLine,
|
||||
// and return the updated array
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
#line 1538 "..\oql-parser.php"
|
||||
#line 1540 "..\oql-parser.php"
|
||||
#line 80 "..\oql-parser.y"
|
||||
function yy_r14(){
|
||||
$this->_retvalue = Array($this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
#line 1543 "..\oql-parser.php"
|
||||
#line 1545 "..\oql-parser.php"
|
||||
#line 86 "..\oql-parser.y"
|
||||
function yy_r16(){
|
||||
// create an array with one single item
|
||||
$this->_retvalue = new OqlJoinSpec($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
#line 1549 "..\oql-parser.php"
|
||||
#line 1551 "..\oql-parser.php"
|
||||
#line 91 "..\oql-parser.y"
|
||||
function yy_r17(){
|
||||
// create an array with one single item
|
||||
$this->_retvalue = new OqlJoinSpec($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
#line 1555 "..\oql-parser.php"
|
||||
#line 1557 "..\oql-parser.php"
|
||||
#line 96 "..\oql-parser.y"
|
||||
function yy_r18(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, '=', $this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1558 "..\oql-parser.php"
|
||||
#line 1560 "..\oql-parser.php"
|
||||
#line 97 "..\oql-parser.y"
|
||||
function yy_r19(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'BELOW', $this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1561 "..\oql-parser.php"
|
||||
#line 1563 "..\oql-parser.php"
|
||||
#line 98 "..\oql-parser.y"
|
||||
function yy_r20(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'BELOW_STRICT', $this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1564 "..\oql-parser.php"
|
||||
#line 1566 "..\oql-parser.php"
|
||||
#line 99 "..\oql-parser.y"
|
||||
function yy_r21(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_BELOW', $this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1567 "..\oql-parser.php"
|
||||
#line 1569 "..\oql-parser.php"
|
||||
#line 100 "..\oql-parser.y"
|
||||
function yy_r22(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_BELOW_STRICT', $this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1570 "..\oql-parser.php"
|
||||
#line 1572 "..\oql-parser.php"
|
||||
#line 101 "..\oql-parser.y"
|
||||
function yy_r23(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'ABOVE', $this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1573 "..\oql-parser.php"
|
||||
#line 1575 "..\oql-parser.php"
|
||||
#line 102 "..\oql-parser.y"
|
||||
function yy_r24(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'ABOVE_STRICT', $this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1576 "..\oql-parser.php"
|
||||
#line 1578 "..\oql-parser.php"
|
||||
#line 103 "..\oql-parser.y"
|
||||
function yy_r25(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_ABOVE', $this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1579 "..\oql-parser.php"
|
||||
#line 1581 "..\oql-parser.php"
|
||||
#line 104 "..\oql-parser.y"
|
||||
function yy_r26(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_ABOVE_STRICT', $this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1582 "..\oql-parser.php"
|
||||
#line 1584 "..\oql-parser.php"
|
||||
#line 106 "..\oql-parser.y"
|
||||
function yy_r27(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; }
|
||||
#line 1585 "..\oql-parser.php"
|
||||
#line 1587 "..\oql-parser.php"
|
||||
#line 111 "..\oql-parser.y"
|
||||
function yy_r31(){ $this->_retvalue = new FunctionOqlExpression($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -1]->minor); }
|
||||
#line 1588 "..\oql-parser.php"
|
||||
#line 1590 "..\oql-parser.php"
|
||||
#line 112 "..\oql-parser.y"
|
||||
function yy_r32(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; }
|
||||
#line 1591 "..\oql-parser.php"
|
||||
#line 1593 "..\oql-parser.php"
|
||||
#line 113 "..\oql-parser.y"
|
||||
function yy_r33(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1594 "..\oql-parser.php"
|
||||
#line 1596 "..\oql-parser.php"
|
||||
#line 119 "..\oql-parser.y"
|
||||
function yy_r37(){
|
||||
if ($this->yystack[$this->yyidx + -1]->minor == 'MATCHES')
|
||||
@@ -1600,43 +1600,43 @@ throw new OQLParserStackOverFlowException($this->m_sSourceQuery, $this->m_iLine,
|
||||
$this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
}
|
||||
#line 1606 "..\oql-parser.php"
|
||||
#line 1608 "..\oql-parser.php"
|
||||
#line 136 "..\oql-parser.y"
|
||||
function yy_r42(){
|
||||
$this->_retvalue = new ListOqlExpression($this->yystack[$this->yyidx + -1]->minor);
|
||||
}
|
||||
#line 1611 "..\oql-parser.php"
|
||||
#line 1613 "..\oql-parser.php"
|
||||
#line 139 "..\oql-parser.y"
|
||||
function yy_r43(){
|
||||
$this->_retvalue = new NestedQueryOqlExpression($this->yystack[$this->yyidx + -1]->minor);
|
||||
}
|
||||
#line 1616 "..\oql-parser.php"
|
||||
#line 1618 "..\oql-parser.php"
|
||||
#line 154 "..\oql-parser.y"
|
||||
function yy_r47(){
|
||||
$this->_retvalue = array();
|
||||
}
|
||||
#line 1621 "..\oql-parser.php"
|
||||
#line 1623 "..\oql-parser.php"
|
||||
#line 165 "..\oql-parser.y"
|
||||
function yy_r51(){ $this->_retvalue = new IntervalOqlExpression($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1624 "..\oql-parser.php"
|
||||
#line 1626 "..\oql-parser.php"
|
||||
#line 178 "..\oql-parser.y"
|
||||
function yy_r61(){ $this->_retvalue = new ScalarOqlExpression($this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1627 "..\oql-parser.php"
|
||||
#line 1629 "..\oql-parser.php"
|
||||
#line 180 "..\oql-parser.y"
|
||||
function yy_r63(){ $this->_retvalue = new ScalarOqlExpression(null); }
|
||||
#line 1630 "..\oql-parser.php"
|
||||
#line 1632 "..\oql-parser.php"
|
||||
#line 182 "..\oql-parser.y"
|
||||
function yy_r64(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1633 "..\oql-parser.php"
|
||||
#line 1635 "..\oql-parser.php"
|
||||
#line 183 "..\oql-parser.y"
|
||||
function yy_r65(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -2]->minor); }
|
||||
#line 1636 "..\oql-parser.php"
|
||||
#line 1638 "..\oql-parser.php"
|
||||
#line 184 "..\oql-parser.y"
|
||||
function yy_r66(){ $this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; }
|
||||
#line 1639 "..\oql-parser.php"
|
||||
#line 1641 "..\oql-parser.php"
|
||||
#line 187 "..\oql-parser.y"
|
||||
function yy_r67(){ $this->_retvalue = new VariableOqlExpression(substr($this->yystack[$this->yyidx + 0]->minor, 1)); }
|
||||
#line 1642 "..\oql-parser.php"
|
||||
#line 1644 "..\oql-parser.php"
|
||||
#line 189 "..\oql-parser.y"
|
||||
function yy_r68(){
|
||||
if ($this->yystack[$this->yyidx + 0]->minor[0] == '`')
|
||||
@@ -1649,22 +1649,22 @@ throw new OQLParserStackOverFlowException($this->m_sSourceQuery, $this->m_iLine,
|
||||
}
|
||||
$this->_retvalue = new OqlName($name, $this->m_iColPrev);
|
||||
}
|
||||
#line 1655 "..\oql-parser.php"
|
||||
#line 1657 "..\oql-parser.php"
|
||||
#line 200 "..\oql-parser.y"
|
||||
function yy_r69(){$this->_retvalue=(int)$this->yystack[$this->yyidx + 0]->minor; }
|
||||
#line 1658 "..\oql-parser.php"
|
||||
#line 1660 "..\oql-parser.php"
|
||||
#line 201 "..\oql-parser.y"
|
||||
function yy_r70(){$this->_retvalue=(int)-$this->yystack[$this->yyidx + 0]->minor; }
|
||||
#line 1661 "..\oql-parser.php"
|
||||
#line 1663 "..\oql-parser.php"
|
||||
#line 202 "..\oql-parser.y"
|
||||
function yy_r71(){$this->_retvalue=new OqlHexValue($this->yystack[$this->yyidx + 0]->minor); }
|
||||
#line 1664 "..\oql-parser.php"
|
||||
#line 1666 "..\oql-parser.php"
|
||||
#line 203 "..\oql-parser.y"
|
||||
function yy_r72(){$this->_retvalue=stripslashes(substr($this->yystack[$this->yyidx + 0]->minor, 1, strlen($this->yystack[$this->yyidx + 0]->minor) - 2)); }
|
||||
#line 1667 "..\oql-parser.php"
|
||||
#line 1669 "..\oql-parser.php"
|
||||
#line 206 "..\oql-parser.y"
|
||||
function yy_r73(){$this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; }
|
||||
#line 1670 "..\oql-parser.php"
|
||||
#line 1672 "..\oql-parser.php"
|
||||
|
||||
/**
|
||||
* placeholder for the left hand side in a reduce operation.
|
||||
@@ -1768,7 +1768,7 @@ throw new OQLParserStackOverFlowException($this->m_sSourceQuery, $this->m_iLine,
|
||||
#line 33 "..\oql-parser.y"
|
||||
|
||||
throw new OQLParserParseFailureException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol);
|
||||
#line 1775 "..\oql-parser.php"
|
||||
#line 1777 "..\oql-parser.php"
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1783,7 +1783,7 @@ throw new OQLParserParseFailureException($this->m_sSourceQuery, $this->m_iLine,
|
||||
#line 25 "..\oql-parser.y"
|
||||
|
||||
throw new OQLParserSyntaxErrorException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol, $this->tokenName($yymajor), $TOKEN);
|
||||
#line 1791 "..\oql-parser.php"
|
||||
#line 1793 "..\oql-parser.php"
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2043,4 +2043,4 @@ class OQLParser extends OQLParserRaw
|
||||
}
|
||||
}
|
||||
|
||||
#line 2052 "..\oql-parser.php"
|
||||
#line 2054 "..\oql-parser.php"
|
||||
|
||||
@@ -314,7 +314,7 @@ class ormDocument
|
||||
'document' => $oDocument,
|
||||
'content_disposition' => $sContentDisposition,
|
||||
);
|
||||
EventService::FireEvent(new EventData(EVENT_DOWNLOAD_DOCUMENT, $sClass, $aEventData));
|
||||
EventService::FireEvent(new EventData(\EVENT_DOWNLOAD_DOCUMENT, $sClass, $aEventData));
|
||||
$oPage->TrashUnexpectedOutput();
|
||||
$oPage->SetContentType($oDocument->GetMimeType());
|
||||
$oPage->SetContentDisposition($sContentDisposition,$oDocument->GetFileName());
|
||||
|
||||
@@ -500,17 +500,17 @@ EOF
|
||||
if (file_exists($sDotExecutable))
|
||||
{
|
||||
// create the file with Graphviz
|
||||
if (!is_dir(APPROOT."data"))
|
||||
if (!is_dir(utils::GetDataPath()))
|
||||
{
|
||||
@mkdir(APPROOT."data");
|
||||
@mkdir(utils::GetDataPath());
|
||||
}
|
||||
if (!is_dir(APPROOT."data/tmp"))
|
||||
if (!is_dir(utils::GetDataPath()."tmp"))
|
||||
{
|
||||
@mkdir(APPROOT."data/tmp");
|
||||
@mkdir(utils::GetDataPath()."tmp");
|
||||
}
|
||||
$sImageFilePath = tempnam(APPROOT."data/tmp", 'png-');
|
||||
$sImageFilePath = tempnam(utils::GetDataPath()."tmp", 'png-');
|
||||
$sDotDescription = $this->GetDotDescription();
|
||||
$sDotFilePath = tempnam(APPROOT."data/tmp", 'dot-');
|
||||
$sDotFilePath = tempnam(utils::GetDataPath()."tmp", 'dot-');
|
||||
|
||||
$rFile = @fopen($sDotFilePath, "w");
|
||||
@fwrite($rFile, $sDotDescription);
|
||||
@@ -556,17 +556,17 @@ EOF
|
||||
if (file_exists($sDotExecutable))
|
||||
{
|
||||
// create the file with Graphviz
|
||||
if (!is_dir(APPROOT."data"))
|
||||
if (!is_dir(utils::GetDataPath()))
|
||||
{
|
||||
@mkdir(APPROOT."data");
|
||||
@mkdir(utils::GetDataPath());
|
||||
}
|
||||
if (!is_dir(APPROOT."data/tmp"))
|
||||
if (!is_dir(utils::GetDataPath()."tmp"))
|
||||
{
|
||||
@mkdir(APPROOT."data/tmp");
|
||||
@mkdir(utils::GetDataPath()."tmp");
|
||||
}
|
||||
$sXdotFilePath = tempnam(APPROOT."data/tmp", 'xdot-');
|
||||
$sXdotFilePath = tempnam(utils::GetDataPath()."tmp", 'xdot-');
|
||||
$sDotDescription = $this->GetDotDescription(true); // true => don't put (localized) labels in the file, since it makes it harder to parse
|
||||
$sDotFilePath = tempnam(APPROOT."data/tmp", 'dot-');
|
||||
$sDotFilePath = tempnam(utils::GetDataPath()."tmp", 'dot-');
|
||||
|
||||
$rFile = @fopen($sDotFilePath, "w");
|
||||
@fwrite($rFile, $sDotDescription);
|
||||
|
||||
@@ -200,7 +200,7 @@ abstract class TriggerOnObject extends Trigger
|
||||
{
|
||||
parent::DoCheckToWrite();
|
||||
|
||||
$sFilter = trim($this->Get('filter'));
|
||||
$sFilter = trim($this->Get('filter') ?? '');
|
||||
if (strlen($sFilter) > 0)
|
||||
{
|
||||
try
|
||||
|
||||
@@ -1264,19 +1264,13 @@ class UserRights
|
||||
{
|
||||
$sUserPicturesFolder = 'images/user-pictures/';
|
||||
$sUserPicturePlaceholderPrefKey = 'user_picture_placeholder';
|
||||
$sPictureUrl = null;
|
||||
|
||||
// First, check cache
|
||||
if (array_key_exists($sLogin, static::$m_aCacheContactPictureAbsUrl)) {
|
||||
return static::$m_aCacheContactPictureAbsUrl[$sLogin];
|
||||
}
|
||||
|
||||
// Then, the default picture
|
||||
if ($bAllowDefaultPicture === true) {
|
||||
$sPictureUrl = utils::GetAbsoluteUrlAppRoot().$sUserPicturesFolder.'user-profile-default-256px.png';
|
||||
} else {
|
||||
$sPictureUrl = null;
|
||||
}
|
||||
|
||||
// Then check if the user has a contact attached and if it has an picture defined
|
||||
$sContactId = UserRights::GetContactId($sLogin);
|
||||
if (!empty($sContactId)) {
|
||||
@@ -1323,6 +1317,11 @@ class UserRights
|
||||
}
|
||||
// Else, no contact and no login, then it's for an unknown origin (system, extension, ...)
|
||||
|
||||
// Then, the default picture
|
||||
if (utils::IsNullOrEmptyString($sPictureUrl) && $bAllowDefaultPicture === true) {
|
||||
$sPictureUrl = utils::GetAbsoluteUrlAppRoot().$sUserPicturesFolder.'user-profile-default-256px.png';
|
||||
}
|
||||
|
||||
// Update cache
|
||||
static::$m_aCacheContactPictureAbsUrl[$sLogin] = $sPictureUrl;
|
||||
|
||||
|
||||
@@ -1,75 +1,108 @@
|
||||
## Description
|
||||
This is a brief description of the SASS 7-1 system and how to use it.
|
||||
- [File structure](#file-structure)
|
||||
- [Usage](#usage)
|
||||
# Description
|
||||
This is a brief description of the how the backoffice theme is structured using both BEM and SASS 7-1 systems and how to use them.
|
||||
* [7-1 pattern](#7-1-pattern)
|
||||
* [File structure](#file-structure)
|
||||
* [Usage](#usage)
|
||||
* [BEM methodology](#bem-methodology)
|
||||
* [Principles](#principles)
|
||||
* [Examples](#examples)
|
||||
|
||||
# 7-1 pattern
|
||||
## File structure
|
||||
SCSS files are structured following the [7-1 pattern](https://sass-guidelin.es/#the-7-1-pattern). \
|
||||
@rveitch made a great summary with the following, which can also be found [here](https://gist.github.com/rveitch/84cea9650092119527bc).
|
||||
|
||||
_Note: Folders with an * are customizations we made to the original 7-1 pattern to best fit our needs_
|
||||
_Note: Folders with an * are customizations we made to the original 7-1 pattern to best fit our needs_
|
||||
|
||||
```
|
||||
css/backoffice/
|
||||
|
|
||||
|– utils/
|
||||
| |– _variables.scss # Sass Variables
|
||||
| |– _functions.scss # Sass Functions
|
||||
| |– _mixins.scss # Sass Mixins
|
||||
| |– _helpers.scss # Class & placeholders helpers
|
||||
| |– variables/ # Sass Variables used in Functions, Mixins, Helpers, ...
|
||||
| | |- colors/
|
||||
| | | |- _base.scss
|
||||
| | | |- _base-palette.scss # Base colors used everywhere
|
||||
| | | |- _lifecycle-palette.scss # Colors used for lifecycle of an object (e.g. representing states such as new, frozen, done, ...), based on the base colors
|
||||
| | | |- _semantic-palette.scss # Colors used for semantic meaning (e.g. red for errors, green for success, ...), based on the base colors
|
||||
| | | ...
|
||||
| | |
|
||||
| | |- _depression.scss
|
||||
| | |- _elevation.scss
|
||||
| | |- _size.scss # Base sizes used everywhere (spacings, ...)
|
||||
| | |- _spacing.scss
|
||||
| | |- _typography.scss # Typography sizes, weights, families, ...
|
||||
| | ...
|
||||
| |
|
||||
| |– functions/ # Sass Functions
|
||||
| | |- _color.scss # Color manipulation functions
|
||||
| |
|
||||
| |– mixins/ # Sass Mixins
|
||||
| |– helpers/ # Class & placeholders helpers
|
||||
|
|
||||
|– vendors/
|
||||
| |– _bootstrap.scss # Bootstrap
|
||||
| |– _jquery-ui.scss # jQuery UI
|
||||
| ... # Etc…
|
||||
|– vendors/ # Third-party libs, should be either:
|
||||
| # - Overload of the lib SCSS variables (BEST way, but possible only if the lib exposes them. e.g. Bulma)
|
||||
| # - Overload of the lib necessary CSS classes only (not great as it duplicates some rules in the browser, which add weight and computation. e.g. dataTables)
|
||||
| # - Duplicate the lib CSS completly to insert SCSS variables (not great as it will be outdated when updating the lib itself. e.g. jQuery UI)
|
||||
| |– _bulma-variables-overload.scss # Bulma CSS framework
|
||||
| |– _jquery-ui.scss # jQuery UI
|
||||
| ... # Etc…
|
||||
|
|
||||
|– base/
|
||||
| |– _reset.scss # Reset/normalize
|
||||
| |– _typography.scss # Typography rules
|
||||
| ... # Etc…
|
||||
| |– _reset.scss # Reset/normalize
|
||||
| |– _typography.scss # Typography fonts imports
|
||||
| ... # Etc…
|
||||
|
|
||||
|– components/
|
||||
| |– _buttons.scss # Buttons
|
||||
| |– _carousel.scss # Carousel
|
||||
| |– _cover.scss # Cover
|
||||
| |– _dropdown.scss # Dropdown
|
||||
| ... # Etc…
|
||||
|– components/ # Components of the UI, each corresponding to a UI block and being usable as a standalone
|
||||
| |– _button.scss
|
||||
| |– _button-group.scss
|
||||
| |– _global-search.scss
|
||||
| |– _quick-create.scss
|
||||
| ...
|
||||
|
|
||||
|– layout/
|
||||
| |– _navigation.scss # Navigation
|
||||
| |– _grid.scss # Grid system
|
||||
| |– _header.scss # Header
|
||||
| |– _footer.scss # Footer
|
||||
| |– _sidebar.scss # Sidebar
|
||||
| |– _forms.scss # Forms
|
||||
| ... # Etc…
|
||||
|– layout/ # Elements of the UI made of several components, making the layout of the app
|
||||
| |– activity-panel/
|
||||
| |– dashboard/
|
||||
| |– object/ # DM object display (details, summary card, ...)
|
||||
| |– tab-container/
|
||||
| ...
|
||||
|
|
||||
|- *application/ # Elements that are not usable as a standalone (like componants and layouts are) and very application (the backoffice) specific
|
||||
|- *application/ # Elements that are not usable as a standalone (like componants and layouts are) and very application (the backoffice) specific
|
||||
| |- display-block
|
||||
| |- tabular-fields
|
||||
| ...
|
||||
|
|
||||
|- *datamodel/ # SCSS / CSS3 variables and CSS classes for PHP classes of the DM that are part of the core (not in a module) and cannot be styled otherwise
|
||||
|- *datamodel/ # SCSS / CSS3 variables and CSS classes for *PHP* classes of the DM that are part of the core (not in a module) and cannot be styled otherwise
|
||||
| |- _action.scss
|
||||
| |- _user.scss
|
||||
| ...
|
||||
|
|
||||
|– pages/
|
||||
| |– _home.scss # Home specific styles
|
||||
| |– _contact.scss # Contact specific styles
|
||||
| ... # Etc…
|
||||
|– pages/ # SCSS / CSS3 variables and CSS classes for HTML elements specific to backoffice pages
|
||||
| |– _base.scss # Base for all backoffice pages
|
||||
| |– _audit.scss # Audit page
|
||||
| |– _csv-import.scss # CSV Import page
|
||||
| ... # Etc…
|
||||
|
|
||||
|- *blocks-integrations # Specific rules for the integration of a block with another one, those kind of rules should never be in the block partial directly
|
||||
| |- _panel-with-datatable.scss # Changes the negative margins of the datatable so it overlaps the panel's original padding
|
||||
|- *blocks-integrations # Specific rules for the integration of a UI block with another one, those kind of rules should NEVER be in the block partial directly
|
||||
| |- alert/
|
||||
| | |- _alert-with-blocks.scss # How an alert should be displayed when after another block
|
||||
| |- button/
|
||||
| | |- _button-with-button.scss # How a button should be displayed when after another button
|
||||
| | |- _button-with-button-group.scss # How a button should be displayed when before/after a button group
|
||||
| |- panel/
|
||||
| | |- _panel-with-blocks.scss # How a panel should be displayed when after another block
|
||||
| | |- _panel-within-main-content.scss # How a panel becomes sticky when in the main content
|
||||
| | |- _panel-within-modal.scss # How a panel becomes sticky when in a modal
|
||||
| |- _tab-container-within-panel.scss # Changes the negative margins of the datatable so it overlaps the panel's original padding
|
||||
| ...
|
||||
|
|
||||
|– themes/
|
||||
| |– _theme.scss # Default theme
|
||||
| |– _admin.scss # Admin theme
|
||||
| ... # Etc…
|
||||
| |– _page-banner.scss # ???
|
||||
| ... # Etc…
|
||||
|
|
||||
|
|
||||
`- _shame.scss # Shame file, should contain all the ugly hacks (https://sass-guidelin.es/#shame-file)
|
||||
`– main.scss # Main Sass file
|
||||
|- _fallback.scss # Fallback file, should only contain rules that make standard HTML tags fallback to the style of a custom CSS class
|
||||
|- _shame.scss # Shame file, should contain all the ugly hacks (https://sass-guidelin.es/#shame-file)
|
||||
`– main.scss # Main Sass file
|
||||
```
|
||||
|
||||
## Usage
|
||||
@@ -84,7 +117,58 @@ To avoid common errors, files should be imported in the final file in the follow
|
||||
- Components
|
||||
- Layout
|
||||
- \*Application
|
||||
- \*Datamodel
|
||||
- Pages
|
||||
- \*Block integrations
|
||||
- Themes
|
||||
- Shame file
|
||||
- Shame file
|
||||
|
||||
# BEM methodology
|
||||
## Principles
|
||||
[BEM is a methodology](https://getbem.com/) that helps you to create reusable components and code sharing in front‑end development. \
|
||||
The main idea is to use discriminant classes instead of nested basic selectors for 2 main reasons:
|
||||
* It's easier to understand the purpose of a specific class when seeing it in the HTML markup of the SCSS file
|
||||
* It's easier to override a specific class when needed as you don't need to use a selector at least as precise/complex as the one you want to override
|
||||
|
||||
In our implementation, we start with the code of the UI block, followed by the sub-element, then the property or modifier. Separation is made of `--` instead of `__`.
|
||||
|
||||
## Examples
|
||||
### Classes and CSS properties example
|
||||
```scss
|
||||
// SCSS variables:
|
||||
// - For CSS properties: CSS class, followed by CSS property
|
||||
$ibo-button--padding-y: 6px !default;
|
||||
$ibo-button--padding-x: 9px !default;
|
||||
$ibo-button--border: 0 !default;
|
||||
$ibo-button--border-radius: $ibo-border-radius-400 !default;
|
||||
$ibo-button--box-shadow-bottom: 0px 2px 0px !default;
|
||||
$ibo-button--box-shadow-top: inset 0px 2px 0px !default;
|
||||
|
||||
$ibo-button--label--margin-left: $ibo-spacing-200 !default;
|
||||
|
||||
// CSS classes:
|
||||
.ibo-button {
|
||||
padding: $ibo-button--padding-y $ibo-button--padding-x;
|
||||
border: $ibo-button--border;
|
||||
border-radius: $ibo-button--border-radius;
|
||||
}
|
||||
|
||||
.ibo-button--label {
|
||||
margin-left: $ibo-button--label--margin-left;
|
||||
}
|
||||
```
|
||||
|
||||
### States example
|
||||
```scss
|
||||
// SCSS variables:
|
||||
// Same rule as before, but with a `--is-` or `--on--` suffix
|
||||
$ibo-quick-create--input--padding: $ibo-spacing-0 default;
|
||||
$ibo-quick-create--input--padding-x--is-opened: $ibo-spacing-300 !default;
|
||||
$ibo-quick-create--input--padding-y--is-opened: $ibo-spacing-300 !default;
|
||||
|
||||
$ibo-quick-create--input--width: $ibo-size-0 !default;
|
||||
$ibo-quick-create--input--width--is-opened: 245px !default;
|
||||
|
||||
$ibo-quick-create--input--background-color: $ibo-color-white-100 !default;
|
||||
$ibo-quick-create--input--background-color--on-hover: $ibo-color-grey-200 !default;
|
||||
```
|
||||
@@ -131,7 +131,12 @@ $ibo-welcome-popup--message-title--margin-bottom: $ibo-spacing-700 !default;
|
||||
}
|
||||
|
||||
.ibo-welcome-popup--message-illustration {
|
||||
display: flex;
|
||||
min-width: $ibo-welcome-popup--message-illustration--min-width;
|
||||
aspect-ratio: 1;
|
||||
background-size: $ibo-welcome-popup--message-illustration--background-size;
|
||||
/* Raw svg needs their height overridden in case its defined in one of their attributes */
|
||||
> svg {
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
@@ -3,18 +3,18 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
$ibo-scrollbar--scrollbar-width: 8px !default;
|
||||
$ibo-scrollbar--scrollbar-height: $ibo-scrollbar--scrollbar-width !default; /* For horizontal scrollbars */
|
||||
$ibo-scrollbar--scrollbar-track-background-color: $ibo-color-transparent !default;
|
||||
$ibo-scrollbar--scrollbar-track-border-radius: $ibo-border-radius-500 !default;
|
||||
$ibo-scrollbar--scrollbar-thumb-background-color: $ibo-color-grey-300 !default;
|
||||
$ibo-scrollbar--scrollbar-width: $common-scrollbar--scrollbar-width !default;
|
||||
$ibo-scrollbar--scrollbar-height: $common-scrollbar--scrollbar-height !default; /* For horizontal scrollbars */
|
||||
$ibo-scrollbar--scrollbar-track-background-color: $common-scrollbar--scrollbar-track-background-color !default;
|
||||
$ibo-scrollbar--scrollbar-track-border-radius: $common-scrollbar--scrollbar-track-border-radius !default;
|
||||
$ibo-scrollbar--scrollbar-thumb-background-color: $common-scrollbar--scrollbar-thumb-background-color !default;
|
||||
$ibo-scrollbar--scrollbar-thumb-border: none !default;
|
||||
$ibo-scrollbar--scrollbar-thumb-border-radius: $ibo-border-radius-500 !default;
|
||||
$ibo-scrollbar--scrollbar-thumb-border-radius: $common-scrollbar--scrollbar-thumb-border-radius !default;
|
||||
|
||||
$ibo-svg-illustration--fill: $ibo-color-primary-500 !default;
|
||||
$ibo-svg-illustration--fill: $common-svg-illustration--fill !default;
|
||||
|
||||
$ibo-content-block--background-color: $ibo-color-white-100 !default;
|
||||
$ibo-content-block--border: 1px solid $ibo-color-grey-400 !default;
|
||||
$ibo-content-block--background-color: $common-content-block--background-color !default;
|
||||
$ibo-content-block--border: $common-content-block--border !default;
|
||||
|
||||
/* CSS variables */
|
||||
:root{
|
||||
|
||||
@@ -4,147 +4,3 @@
|
||||
*/
|
||||
|
||||
/* This is an overload of the default lib. stylesheet to use local fonts instead of the CDN */
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 100;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
src: local('Raleway Thin'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-100-normal.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 100;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
src: local('Raleway Thin'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-100-italic.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 200;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
src: local('Raleway ExtraLight'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-200-normal.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 200;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
src: local('Raleway ExtraLight'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-200-italic.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 300;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
src: local('Raleway Light'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-300-normal.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 300;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
src: local('Raleway Light'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-300-italic.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
src: local('Raleway'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-400-normal.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
src: local('Raleway'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-400-italic.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 500;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
src: local('Raleway Medium'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-500-normal.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 500;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
src: local('Raleway Medium'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-500-italic.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 600;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
src: local('Raleway SemiBold'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-600-normal.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 600;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
src: local('Raleway SemiBold'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-600-italic.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
src: local('Raleway'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-700-normal.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 700;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
src: local('Raleway'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-700-italic.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 800;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
src: local('Raleway ExtraBold'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-800-normal.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 800;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
src: local('Raleway ExtraBold'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-800-italic.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 900;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
src: local('Raleway Black'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-900-normal.woff') format('woff'),
|
||||
}
|
||||
@font-face {
|
||||
font-family: Raleway;
|
||||
font-weight: 900;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
src: local('Raleway Black'),
|
||||
url($approot-relative + 'node_modules/@fontsource/raleway/files/raleway-all-900-italic.woff') format('woff'),
|
||||
}
|
||||
|
||||
@@ -81,8 +81,8 @@ $ibo-field--enable-bulk--checkbox--margin-left: $ibo-spacing-300 !default;
|
||||
}
|
||||
}
|
||||
|
||||
/*N°6543 - We need the rule to keep text inside the column when width is defined*/
|
||||
&[data-attribute-type="AttributeHtml"],
|
||||
/*N°6543 - We need the rule to keep text inside the column when width is defined */
|
||||
&[data-attribute-type="AttributeHTML"],
|
||||
&[data-attribute-type="AttributeText"] {
|
||||
&[data-attribute-flag-read-only="true"] {
|
||||
display: grid;
|
||||
@@ -195,8 +195,6 @@ $ibo-field--enable-bulk--checkbox--margin-left: $ibo-spacing-300 !default;
|
||||
/* Hack to force a table to fit its container without overflow (see N°2127) */
|
||||
/* Note that along with with, we now display a "expand" icon on large fields so we can have a better view of its content */
|
||||
.HTML {
|
||||
@extend .ibo-vendors-ckeditor--display-content;
|
||||
|
||||
table {
|
||||
table-layout: fixed;
|
||||
width: 100%;
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
*/
|
||||
|
||||
/* SCSS variables */
|
||||
$ibo-navigation-menu--notifications-menu--min-width: 250px;
|
||||
$ibo-navigation-menu--notifications-menu--min-width: 550px;
|
||||
$ibo-navigation-menu--notifications-menu--max-width: 90vw;
|
||||
|
||||
$ibo-navigation-menu--notifications--item--image--margin-x: 6px !default;
|
||||
$ibo-navigation-menu--notifications--item--image--margin-y: $ibo-spacing-0 !default;
|
||||
@@ -13,9 +14,11 @@ $ibo-navigation-menu--notifications--item--image--max-height: 20px !default;
|
||||
$ibo-navigation-menu--notifications--item--image--border-radius: $ibo-border-radius-full !default;
|
||||
|
||||
$ibo-navigation-menu--notifications--item--bottom-text--margin-left: auto !default;
|
||||
$ibo-navigation-menu--notifications--item--bottom-text--margin-right: auto !default;
|
||||
|
||||
$ibo-navigation-menu--notifications--item--content--padding-y: $ibo-spacing-0 !default;
|
||||
$ibo-navigation-menu--notifications--item--content--padding-x: 14px !default;
|
||||
$ibo-navigation-menu--notifications--item--content--max-height: 128px !default;
|
||||
$ibo-navigation-menu--notifications--item--content--img--max-height: 100px !default;
|
||||
$ibo-navigation-menu--notifications--item--content--img--padding: 5px !default;
|
||||
|
||||
@@ -39,13 +42,15 @@ $ibo-navigation-menu--notifications-show-all-multiple--ibo-popover-menu--indicat
|
||||
|
||||
$ibo-navigation-menu--notifications-dismiss-all--icon--margin: $ibo-spacing-0 10px $ibo-spacing-0 $ibo-spacing-0 !default;
|
||||
|
||||
$ibo-popover-menu--item--no-message--image--svg--width : 100% !default;
|
||||
$ibo-popover-menu--item--no-message--image--svg--width : 220px !default;
|
||||
$ibo-popover-menu--item--no-message--image--svg--height : inherit !default;
|
||||
$ibo-popover-menu--item--no-message--image--svg--padding : 15px !default;
|
||||
|
||||
#ibo-navigation-menu--notifications-menu {
|
||||
flex-flow: column;
|
||||
min-width: $ibo-navigation-menu--notifications-menu--min-width;
|
||||
min-width: min(#{$ibo-navigation-menu--notifications-menu--min-width}, 90vw);
|
||||
max-width: $ibo-navigation-menu--notifications-menu--max-width;
|
||||
|
||||
.ibo-navigation-menu--notifications--messages-section {
|
||||
overflow: auto;
|
||||
}
|
||||
@@ -76,9 +81,14 @@ $ibo-popover-menu--item--no-message--image--svg--padding : 15px !default;
|
||||
float: right;
|
||||
align-self: center;
|
||||
margin-left: $ibo-navigation-menu--notifications--item--bottom-text--margin-left;
|
||||
margin-right: $ibo-navigation-menu--notifications--item--bottom-text--margin-right;
|
||||
}
|
||||
.ibo-navigation-menu--notifications--item--content {
|
||||
flex-grow: 1;
|
||||
padding: $ibo-navigation-menu--notifications--item--content--padding-y $ibo-navigation-menu--notifications--item--content--padding-x;
|
||||
max-height: $ibo-navigation-menu--notifications--item--content--max-height;
|
||||
overflow-y: auto;
|
||||
white-space: normal; /* Overload rule from popupover menu item so that content wraps instead of being on a gigantic line */
|
||||
|
||||
img {
|
||||
max-height: $ibo-navigation-menu--notifications--item--content--img--max-height;
|
||||
@@ -88,6 +98,7 @@ $ibo-popover-menu--item--no-message--image--svg--padding : 15px !default;
|
||||
.ibo-navigation-menu--notifications-item {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
cursor: pointer;
|
||||
|
||||
.ibo-navigation-menu--notifications--item--content a {
|
||||
@extend %ibo-hyperlink-forced-colors;
|
||||
@@ -100,6 +111,8 @@ $ibo-popover-menu--item--no-message--image--svg--padding : 15px !default;
|
||||
border: $ibo-navigation-menu--notifications--item--new-message-indicator--border;
|
||||
border-radius: $ibo-navigation-menu--notifications--item--new-message-indicator--border-radius;
|
||||
margin-top: $ibo-navigation-menu--notifications--item--new-message-indicator--margin-top;
|
||||
flex-shrink: 0; /* Avoid indicator to be shrinked into a non round shape */
|
||||
|
||||
&.ibo-is-priority-1{
|
||||
background-color: $ibo-navigation-menu--notifications--item--new-message-indicator--is-priority-1--background-color;
|
||||
border: $ibo-navigation-menu--notifications--item--new-message-indicator--is-priority-1--border;
|
||||
@@ -134,8 +147,7 @@ $ibo-popover-menu--item--no-message--image--svg--padding : 15px !default;
|
||||
text-align: center;
|
||||
}
|
||||
.ibo-popover-menu--item--no-message--image > svg {
|
||||
display: flex;
|
||||
width: $ibo-popover-menu--item--no-message--image--svg--width;
|
||||
max-width: $ibo-popover-menu--item--no-message--image--svg--width;
|
||||
height: $ibo-popover-menu--item--no-message--image--svg--height;
|
||||
padding: $ibo-popover-menu--item--no-message--image--svg--padding;
|
||||
}
|
||||
|
||||
@@ -39,6 +39,8 @@ $ibo-quick-create--compartment-title--line-spacing: $ibo-spacing-300 !default;
|
||||
|
||||
$ibo-quick-create--compartment-content--text-color: $ibo-color-grey-900 !default;
|
||||
|
||||
$ibo-quick-create--compartment-results--element--max-height: unset !default;
|
||||
|
||||
$ibo-quick-create--compartment-element--padding-x: $ibo-spacing-300 !default;
|
||||
$ibo-quick-create--compartment-element--padding-y: $ibo-spacing-200 !default;
|
||||
$ibo-quick-create--compartment-element--margin-x: -1 * $ibo-quick-create--compartment-element--padding-x !default;
|
||||
@@ -49,6 +51,7 @@ $ibo-quick-create--compartment-element-image--margin-right: $ibo-spacing-300 !de
|
||||
$ibo-quick-create--compartment-element-image--width: 20px !default;
|
||||
|
||||
$ibo-quick-create--compartment-results--container--width: 100% !important !default;
|
||||
$ibo-quick-create--compartment-results--container--background-color: transparent !default;
|
||||
|
||||
$ibo-quick-create--compartment--placeholder-image--margin-top: $ibo-spacing-600 !default;
|
||||
$ibo-quick-create--compartment--placeholder-image--margin-bottom: $ibo-spacing-500 !default;
|
||||
@@ -219,28 +222,38 @@ $ibo-quick-create--compartment--placeholder-hint--text-color: $ibo-color-grey-70
|
||||
}
|
||||
|
||||
.ibo-quick-create--compartment-results--container{
|
||||
position: static;
|
||||
width: $ibo-quick-create--compartment-results--container--width;
|
||||
background: $ibo-quick-create--compartment-results--container--background-color;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
.ibo-quick-create--compartment-results--element > .option{
|
||||
padding: $ibo-quick-create--compartment-element--padding-y $ibo-quick-create--compartment-element--padding-x;
|
||||
margin-left: $ibo-quick-create--compartment-element--margin-x;
|
||||
margin-right: $ibo-quick-create--compartment-element--margin-x;
|
||||
color: inherit;
|
||||
.ibo-quick-create--compartment-results--element {
|
||||
overflow: unset;
|
||||
max-height: $ibo-quick-create--compartment-results--element--max-height;
|
||||
|
||||
&> .option {
|
||||
padding: $ibo-quick-create--compartment-element--padding-y $ibo-quick-create--compartment-element--padding-x;
|
||||
margin-left: $ibo-quick-create--compartment-element--margin-x;
|
||||
margin-right: $ibo-quick-create--compartment-element--margin-x;
|
||||
color: inherit;
|
||||
|
||||
@extend %ibo-text-truncated-with-ellipsis;
|
||||
@extend %ibo-text-truncated-with-ellipsis;
|
||||
|
||||
&.active{
|
||||
background-color: $ibo-quick-create--compartment-element--background-color--is-active;
|
||||
border-radius: $ibo-quick-create--compartment-element--border-radius--is-active;
|
||||
}
|
||||
&:hover{
|
||||
cursor: pointer;
|
||||
@extend a;
|
||||
}
|
||||
&.active {
|
||||
background-color: $ibo-quick-create--compartment-element--background-color--is-active;
|
||||
border-radius: $ibo-quick-create--compartment-element--border-radius--is-active;
|
||||
}
|
||||
|
||||
.highlight{
|
||||
font-weight: bold;
|
||||
}
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
@extend a;
|
||||
}
|
||||
|
||||
.highlight {
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ibo-quick-create--compartment--placeholder{
|
||||
|
||||
@@ -124,7 +124,7 @@ $ibo-fieldsorter--selected--background-color: $ibo-color-blue-200 !default;
|
||||
justify-content: end;
|
||||
}
|
||||
/* N°6543 - We need the rule to keep text inside the column when width is defined */
|
||||
> [data-attribute-type="AttributeHtml"],
|
||||
> [data-attribute-type="AttributeHTML"],
|
||||
> [data-attribute-type="AttributeText"] {
|
||||
max-width: 100%;
|
||||
overflow: auto;
|
||||
|
||||
@@ -41,8 +41,8 @@ $ibo-input-select--select-wrapper--action-button--margin-right: 20px !default;
|
||||
$ibo-input-select--action-button--padding-left: 6px !default;
|
||||
$ibo-input-select--action-button--padding-right: $ibo-spacing-100 !default;
|
||||
|
||||
$ibo-input-select--autocomplete-item-image--size: 25px !default;
|
||||
$ibo-input-select--autocomplete-item-image--margin-right: 0.5rem !default;
|
||||
$ibo-input-select--autocomplete-item-image--size: 30px !default;
|
||||
$ibo-input-select--autocomplete-item-image--margin-right: 0.7rem !default;
|
||||
$ibo-input-select--autocomplete-item-image--background-color: $ibo-color-blue-100 !default;
|
||||
$ibo-input-select--autocomplete-item-image--border: 1px solid $ibo-color-grey-600 !default;
|
||||
|
||||
@@ -233,6 +233,7 @@ $ibo-input-select--autocomplete-item-image--border: 1px solid $ibo-color-grey-60
|
||||
}
|
||||
|
||||
.ibo-input-select--autocomplete-item-txt {
|
||||
@extend %ibo-font-ral-nor-100;
|
||||
@extend %ibo-text-truncated-with-ellipsis;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@ $ibo-dm-class--Action--complementary-color: $ibo-color-white-100 !default;
|
||||
|
||||
.ibo-dm-class--Action {
|
||||
--ibo-main-color: #{$ibo-dm-class--Action--main-color};
|
||||
--ibo-main-color--100: #{ibo-adjust-alpha(ibo-adjust-lightness($ibo-dm-class--Action--main-color, $ibo-color-base-lightness-100), $ibo-color-base-opacity-for-lightness-100)};
|
||||
--ibo-main-color--900: #{ibo-adjust-alpha(ibo-adjust-lightness($ibo-dm-class--Action--main-color, $ibo-color-base-lightness-900), $ibo-color-base-opacity-for-lightness-900)};
|
||||
--ibo-main-color--100: #{common-adjust-alpha(common-adjust-lightness($ibo-dm-class--Action--main-color, $ibo-color-base-lightness-100), $ibo-color-base-opacity-for-lightness-100)};
|
||||
--ibo-main-color--900: #{common-adjust-alpha(common-adjust-lightness($ibo-dm-class--Action--main-color, $ibo-color-base-lightness-900), $ibo-color-base-opacity-for-lightness-900)};
|
||||
--ibo-complementary-color: #{$ibo-dm-class--Action--complementary-color};
|
||||
}
|
||||
|
||||
@@ -35,8 +35,8 @@ $ibo-dm-enum--Action-status-enabled--complementary-color: $ibo-lifecycle-active-
|
||||
|
||||
.ibo-dm-enum--Action-status-enabled {
|
||||
--ibo-main-color: #{$ibo-dm-enum--Action-status-enabled--main-color};
|
||||
--ibo-main-color--100: #{ibo-adjust-alpha(ibo-adjust-lightness($ibo-dm-enum--Action-status-enabled--main-color, $ibo-color-base-lightness-100), $ibo-color-base-opacity-for-lightness-100)};
|
||||
--ibo-main-color--900: #{ibo-adjust-alpha(ibo-adjust-lightness($ibo-dm-enum--Action-status-enabled--main-color, $ibo-color-base-lightness-900), $ibo-color-base-opacity-for-lightness-900)};
|
||||
--ibo-main-color--100: #{common-adjust-alpha(common-adjust-lightness($ibo-dm-enum--Action-status-enabled--main-color, $ibo-color-base-lightness-100), $ibo-color-base-opacity-for-lightness-100)};
|
||||
--ibo-main-color--900: #{common-adjust-alpha(common-adjust-lightness($ibo-dm-enum--Action-status-enabled--main-color, $ibo-color-base-lightness-900), $ibo-color-base-opacity-for-lightness-900)};
|
||||
--ibo-complementary-color: #{$ibo-dm-enum--Action-status-enabled--complementary-color};
|
||||
}
|
||||
|
||||
@@ -56,8 +56,8 @@ $ibo-dm-enum--Action-status-disabled--complementary-color: $ibo-lifecycle-frozen
|
||||
|
||||
.ibo-dm-enum--Action-status-disabled {
|
||||
--ibo-main-color: #{$ibo-dm-enum--Action-status-disabled--main-color};
|
||||
--ibo-main-color--100: #{ibo-adjust-alpha(ibo-adjust-lightness($ibo-dm-enum--Action-status-disabled--main-color, $ibo-color-base-lightness-100), $ibo-color-base-opacity-for-lightness-100)};
|
||||
--ibo-main-color--900: #{ibo-adjust-alpha(ibo-adjust-lightness($ibo-dm-enum--Action-status-disabled--main-color, $ibo-color-base-lightness-900), $ibo-color-base-opacity-for-lightness-900)};
|
||||
--ibo-main-color--100: #{common-adjust-alpha(common-adjust-lightness($ibo-dm-enum--Action-status-disabled--main-color, $ibo-color-base-lightness-100), $ibo-color-base-opacity-for-lightness-100)};
|
||||
--ibo-main-color--900: #{common-adjust-alpha(common-adjust-lightness($ibo-dm-enum--Action-status-disabled--main-color, $ibo-color-base-lightness-900), $ibo-color-base-opacity-for-lightness-900)};
|
||||
--ibo-complementary-color: #{$ibo-dm-enum--Action-status-disabled--complementary-color};
|
||||
}
|
||||
|
||||
@@ -78,8 +78,8 @@ $ibo-dm-enum--Action-status-test--complementary-color: $ibo-lifecycle-inactive-s
|
||||
|
||||
.ibo-dm-enum--Action-status-test {
|
||||
--ibo-main-color: #{$ibo-dm-enum--Action-status-test--main-color};
|
||||
--ibo-main-color--100: #{ibo-adjust-alpha(ibo-adjust-lightness($ibo-dm-enum--Action-status-test--main-color, $ibo-color-base-lightness-100), $ibo-color-base-opacity-for-lightness-100)};
|
||||
--ibo-main-color--900: #{ibo-adjust-alpha(ibo-adjust-lightness($ibo-dm-enum--Action-status-test--main-color, $ibo-color-base-lightness-900), $ibo-color-base-opacity-for-lightness-900)};
|
||||
--ibo-main-color--100: #{common-adjust-alpha(common-adjust-lightness($ibo-dm-enum--Action-status-test--main-color, $ibo-color-base-lightness-100), $ibo-color-base-opacity-for-lightness-100)};
|
||||
--ibo-main-color--900: #{common-adjust-alpha(common-adjust-lightness($ibo-dm-enum--Action-status-test--main-color, $ibo-color-base-lightness-900), $ibo-color-base-opacity-for-lightness-900)};
|
||||
--ibo-complementary-color: #{$ibo-dm-enum--Action-status-test--complementary-color};
|
||||
}
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@ $ibo-dm-class--User--complementary-color: $ibo-color-white-100 !default;
|
||||
|
||||
.ibo-dm-class--User {
|
||||
--ibo-main-color: #{$ibo-dm-class--User--main-color};
|
||||
--ibo-main-color--100: #{ibo-adjust-alpha(ibo-adjust-lightness($ibo-dm-class--User--main-color, $ibo-color-base-lightness-100), $ibo-color-base-opacity-for-lightness-100)};
|
||||
--ibo-main-color--900: #{ibo-adjust-alpha(ibo-adjust-lightness($ibo-dm-class--User--main-color, $ibo-color-base-lightness-900), $ibo-color-base-opacity-for-lightness-900)};
|
||||
--ibo-main-color--100: #{common-adjust-alpha(common-adjust-lightness($ibo-dm-class--User--main-color, $ibo-color-base-lightness-100), $ibo-color-base-opacity-for-lightness-100)};
|
||||
--ibo-main-color--900: #{common-adjust-alpha(common-adjust-lightness($ibo-dm-class--User--main-color, $ibo-color-base-lightness-900), $ibo-color-base-opacity-for-lightness-900)};
|
||||
--ibo-complementary-color: #{$ibo-dm-class--User--complementary-color};
|
||||
}
|
||||
.ibo-dm-class-alt--User {
|
||||
@@ -34,8 +34,8 @@ $ibo-dm-enum--User-status-enabled--complementary-color: $ibo-lifecycle-active-st
|
||||
|
||||
.ibo-dm-enum--User-status-enabled {
|
||||
--ibo-main-color: #{$ibo-dm-enum--User-status-enabled--main-color};
|
||||
--ibo-main-color--100: #{ibo-adjust-alpha(ibo-adjust-lightness($ibo-dm-enum--User-status-enabled--main-color, $ibo-color-base-lightness-100), $ibo-color-base-opacity-for-lightness-100)};
|
||||
--ibo-main-color--900: #{ibo-adjust-alpha(ibo-adjust-lightness($ibo-dm-enum--User-status-enabled--main-color, $ibo-color-base-lightness-900), $ibo-color-base-opacity-for-lightness-900)};
|
||||
--ibo-main-color--100: #{common-adjust-alpha(common-adjust-lightness($ibo-dm-enum--User-status-enabled--main-color, $ibo-color-base-lightness-100), $ibo-color-base-opacity-for-lightness-100)};
|
||||
--ibo-main-color--900: #{common-adjust-alpha(common-adjust-lightness($ibo-dm-enum--User-status-enabled--main-color, $ibo-color-base-lightness-900), $ibo-color-base-opacity-for-lightness-900)};
|
||||
--ibo-complementary-color: #{$ibo-dm-enum--User-status-enabled--complementary-color};
|
||||
}
|
||||
.ibo-dm-enum-alt--User-status-enabled {
|
||||
@@ -54,8 +54,8 @@ $ibo-dm-enum--User-status-disabled--complementary-color: $ibo-lifecycle-inactive
|
||||
|
||||
.ibo-dm-enum--User-status-disabled {
|
||||
--ibo-main-color: #{$ibo-dm-enum--User-status-disabled--main-color};
|
||||
--ibo-main-color--100: #{ibo-adjust-alpha(ibo-adjust-lightness($ibo-dm-enum--User-status-disabled--main-color, $ibo-color-base-lightness-100), $ibo-color-base-opacity-for-lightness-100)};
|
||||
--ibo-main-color--900: #{ibo-adjust-alpha(ibo-adjust-lightness($ibo-dm-enum--User-status-disabled--main-color, $ibo-color-base-lightness-900), $ibo-color-base-opacity-for-lightness-900)};
|
||||
--ibo-main-color--100: #{common-adjust-alpha(common-adjust-lightness($ibo-dm-enum--User-status-disabled--main-color, $ibo-color-base-lightness-100), $ibo-color-base-opacity-for-lightness-100)};
|
||||
--ibo-main-color--900: #{common-adjust-alpha(common-adjust-lightness($ibo-dm-enum--User-status-disabled--main-color, $ibo-color-base-lightness-900), $ibo-color-base-opacity-for-lightness-900)};
|
||||
--ibo-complementary-color: #{$ibo-dm-enum--User-status-disabled--complementary-color};
|
||||
}
|
||||
.ibo-dm-enum-alt--User-status-disabled {
|
||||
|
||||
@@ -18,7 +18,6 @@ $ibo-caselog-entry--main-information--decoration--width: 3px !default;
|
||||
display: none;
|
||||
}
|
||||
.ibo-activity-entry--main-information-content{
|
||||
@extend .ibo-vendors-ckeditor--display-content;
|
||||
}
|
||||
|
||||
/* Highlight color */
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
@import "../common/main";
|
||||
@import "utils/all";
|
||||
@import "vendors/all";
|
||||
@import "base/all";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*/
|
||||
|
||||
$ibo-notifications--view-all--container--grid-gap: $ibo-spacing-600 !default;
|
||||
$ibo-notifications--view-all--container--object-summary--panel--body--max-height: unset !default;
|
||||
$ibo-notifications--view-all--container--object-summary--panel--body--max-height: 400px !default;
|
||||
|
||||
$ibo-notifications--view-all--item--unread--highlight--background-color: $ibo-color-red-600 !default;
|
||||
$ibo-notifications--view-all--item--read--highlight--background-color: $ibo-color-grey-200 !default;
|
||||
|
||||
@@ -7,28 +7,20 @@
|
||||
* Adjust the lightness of $sColor to the absolute $fTargetLightness value.
|
||||
* It is different than lighten() / darken() that shift the current lightness by X%
|
||||
*
|
||||
* @deprecated Use common-adjust-lightness() instead
|
||||
* @return Modified color value in HSLA format
|
||||
*/
|
||||
@function ibo-adjust-lightness($sColor, $fTargetLightness) {
|
||||
$iHue: hue($sColor);
|
||||
$fSaturation: saturation($sColor);
|
||||
$fLightness: lightness($sColor);
|
||||
$fAlpha: alpha($sColor);
|
||||
|
||||
@return hsla($iHue, $fSaturation, $fTargetLightness, $fAlpha);
|
||||
@return common-adjust-lightness($sColor, $fTargetLightness);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adjust the alpha chanel (opacity) of $sColor to the absolute $fTargetAlpha value.
|
||||
* It is different than opacify() / transparentize() that shift the current alpha value by X%
|
||||
*
|
||||
* @deprecated Use common-adjust-alpha() instead
|
||||
* @return Modified color value in HSLA format
|
||||
*/
|
||||
@function ibo-adjust-alpha($sColor, $fTargetAlpha) {
|
||||
$iHue: hue($sColor);
|
||||
$fSaturation: saturation($sColor);
|
||||
$fLightness: lightness($sColor);
|
||||
$fAlpha: alpha($sColor);
|
||||
|
||||
@return hsla($iHue, $fSaturation, $fLightness, $fTargetAlpha);
|
||||
@return common-adjust-alpha($sColor, $fTargetAlpha);
|
||||
}
|
||||
@@ -3,9 +3,9 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
$ibo-class-icon--small--size: 32px !default;
|
||||
$ibo-class-icon--medium--size: 48px !default;
|
||||
$ibo-class-icon--large--size: 64px !default;
|
||||
$ibo-class-icon--small--size: $common-class-icon--small--size !default;
|
||||
$ibo-class-icon--medium--size: $common-class-icon--medium--size !default;
|
||||
$ibo-class-icon--large--size: $common-class-icon--large--size !default;
|
||||
|
||||
.ibo-class-icon{
|
||||
&.ibo-is-small{
|
||||
|
||||
@@ -3,24 +3,7 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
$ibo-text-colors: (
|
||||
'primary': $ibo-color-primary-800,
|
||||
'secondary': $ibo-color-secondary-800,
|
||||
'neutral': $ibo-color-secondary-800,
|
||||
'information': $ibo-color-information-800,
|
||||
'success': $ibo-color-success-800,
|
||||
'failure': $ibo-color-danger-800,
|
||||
'warning': $ibo-color-warning-800,
|
||||
'danger': $ibo-color-danger-800,
|
||||
'grey' : $ibo-color-grey-800,
|
||||
'blue-grey': $ibo-color-blue-grey-800,
|
||||
'blue': $ibo-color-blue-800,
|
||||
'cyan': $ibo-color-cyan-800,
|
||||
'green': $ibo-color-green-800,
|
||||
'orange': $ibo-color-orange-800,
|
||||
'red': $ibo-color-red-800,
|
||||
'pink': $ibo-color-pink-800,
|
||||
) !default;
|
||||
$ibo-text-colors: $common-text-colors !default;
|
||||
|
||||
@each $sColor, $sColorValue in $ibo-text-colors {
|
||||
.ibo-text.ibo-is-#{$sColor} {
|
||||
|
||||
@@ -8,36 +8,3 @@
|
||||
/* To use it, simply "@extend %fa-regular-base" in a rule and put the desired icon "content: '\f054'" */
|
||||
/******************************************************************************************************************************/
|
||||
|
||||
%fa-regular-base{
|
||||
font-family: "Font Awesome 5 Free";
|
||||
font-weight: 400;
|
||||
|
||||
-webkit-font-smoothing: antialiased;
|
||||
display: inline-block;
|
||||
font-style: normal;
|
||||
font-variant: normal;
|
||||
text-rendering: auto;
|
||||
line-height: 1;
|
||||
}
|
||||
%fa-solid-base{
|
||||
font-family: "Font Awesome 5 Free";
|
||||
font-weight: 900;
|
||||
|
||||
-webkit-font-smoothing: antialiased;
|
||||
display: inline-block;
|
||||
font-style: normal;
|
||||
font-variant: normal;
|
||||
text-rendering: auto;
|
||||
line-height: 1;
|
||||
}
|
||||
%fc-regular-base{
|
||||
display: inline-block;
|
||||
font-family: CombodoRegular;
|
||||
font-style: normal;
|
||||
font-variant: normal;
|
||||
font-weight: normal;
|
||||
text-rendering: auto;
|
||||
line-height: 1;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
@@ -10,13 +10,13 @@
|
||||
/***********************************************************************/
|
||||
|
||||
/* SCSS variables */
|
||||
$ibo-sticky-sentinel--left: 0 !default;
|
||||
$ibo-sticky-sentinel--right: 0 !default;
|
||||
$ibo-sticky-sentinel--height: 0 !default;
|
||||
$ibo-sticky-sentinel-top--top: 0 !default;
|
||||
$ibo-sticky-sentinel-top--height: $ibo-sticky-sentinel--height !default;
|
||||
$ibo-sticky-sentinel-bottom--bottom: 0 !default;
|
||||
$ibo-sticky-sentinel-bottom--height: $ibo-sticky-sentinel--height !default;
|
||||
$ibo-sticky-sentinel--left: $common-sticky-sentinel--left !default;
|
||||
$ibo-sticky-sentinel--right: $common-sticky-sentinel--right !default;
|
||||
$ibo-sticky-sentinel--height: $common-sticky-sentinel--height !default;
|
||||
$ibo-sticky-sentinel-top--top: $common-sticky-sentinel-top--top !default;
|
||||
$ibo-sticky-sentinel-top--height: $common-sticky-sentinel-top--height !default;
|
||||
$ibo-sticky-sentinel-bottom--bottom: $common-sticky-sentinel-bottom--bottom !default;
|
||||
$ibo-sticky-sentinel-bottom--height: $common-sticky-sentinel-bottom--height !default;
|
||||
|
||||
/* Rules */
|
||||
.ibo-sticky-sentinel {
|
||||
|
||||
@@ -4,20 +4,23 @@
|
||||
*/
|
||||
|
||||
/* SCSS variables */
|
||||
$ibo-has-description--content: "?" !default;
|
||||
$ibo-has-description--padding-left: $ibo-spacing-200 !default;
|
||||
$ibo-has-description--color: $ibo-color-grey-600 !default;
|
||||
$ibo-has-description--font-size: 0.7em !default; /* Font size is em on purpose as we want it to be proportional to its context */
|
||||
$ibo-has-description--content: $common-has-description--content !default;
|
||||
$ibo-has-description--padding-left: $common-has-description--padding-left !default;
|
||||
$ibo-has-description--color: $common-has-description--color !default;
|
||||
$ibo-has-description--font-size: $common-has-description--font-size !default; /* Font size is em on purpose as we want it to be proportional to its context */
|
||||
|
||||
$ibo-is-code--background-color: $ibo-color-white-200 !default;
|
||||
$ibo-is-code--padding: 1.25rem 1.5rem !default;
|
||||
$ibo-is-code--background-color: $common-is-code--background-color !default;
|
||||
$ibo-is-code--padding: $common-is-code--padding !default;
|
||||
|
||||
$ibo-hyperlink-color: $ibo-color-primary-700 !default;
|
||||
$ibo-hyperlink-text-decoration: none !default;
|
||||
$ibo-hyperlink-color--on-hover: $ibo-color-primary-800 !default;
|
||||
$ibo-hyperlink-text-decoration--on-hover: $ibo-hyperlink-text-decoration !default;
|
||||
$ibo-hyperlink-color--on-active: $ibo-color-primary-900 !default;
|
||||
$ibo-hyperlink-text-decoration--on-active: $ibo-hyperlink-text-decoration !default;
|
||||
$ibo-hyperlink-color: $common-hyperlink-color !default;
|
||||
$ibo-hyperlink-text-decoration: $common-hyperlink-text-decoration !default;
|
||||
$ibo-hyperlink-color--on-hover: $common-hyperlink-color--on-hover !default;
|
||||
$ibo-hyperlink-text-decoration--on-hover: $common-hyperlink-text-decoration--on-hover !default;
|
||||
$ibo-hyperlink-color--on-active: $common-hyperlink-color--on-active !default;
|
||||
$ibo-hyperlink-text-decoration--on-active: $common-hyperlink-text-decoration--on-active !default;
|
||||
|
||||
$ibo-figure--spacing-x: $common-figure--spacing-x !default; /* Mind that this matches Bulma rule for figure */
|
||||
$ibo-figure--spacing-y: $common-figure--spacing-y !default;
|
||||
|
||||
/* CSS variables */
|
||||
:root{
|
||||
@@ -100,13 +103,8 @@ $ibo-hyperlink-text-decoration--on-active: $ibo-hyperlink-text-decoration !defau
|
||||
* See https://bulma.io/documentation/elements/content/
|
||||
*/
|
||||
.ibo-is-html-content {
|
||||
@extend .content;
|
||||
|
||||
/* Force user-generated tables to fit within the container as they often have an hard-coded width */
|
||||
table {
|
||||
width: unset !important;
|
||||
max-width: max-content;
|
||||
}
|
||||
@extend .content; /* Bulma styles */
|
||||
@extend .ck-content; /* CKEditor styles */
|
||||
|
||||
/* For table to render like in CKEditor, works with bulma lib. overload see:
|
||||
* - ../../vendors/_bulma-variables-overload.scss)
|
||||
@@ -117,19 +115,27 @@ $ibo-hyperlink-text-decoration--on-active: $ibo-hyperlink-text-decoration !defau
|
||||
border-spacing: 2px;
|
||||
}
|
||||
|
||||
/*
|
||||
* N°5317 - Handle overlapping tables when table cells have fixed widths
|
||||
* Force table cell NOT to have a fixed width and to wrap when necessary
|
||||
*/
|
||||
td {
|
||||
width: unset !important;
|
||||
word-break: break-word !important;
|
||||
white-space: unset !important;
|
||||
}
|
||||
|
||||
/* Preserve original text color in code blocks, except for the Highlight.js blocks which have their own colors */
|
||||
& > code,
|
||||
code:not(.hljs) {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0.25em;
|
||||
margin-bottom: 0.25em;
|
||||
}
|
||||
|
||||
figure {
|
||||
display: inline-block; /* So the figure doesn't take all width and can be aligned on the left */
|
||||
margin-left: $ibo-figure--spacing-x !important; /* !important to overload the CKE inline style */
|
||||
margin-right: $ibo-figure--spacing-x !important; /* !important to overload the CKE inline style */
|
||||
|
||||
&:not(:last-child) {
|
||||
margin-bottom: $ibo-figure--spacing-y !important; /* !important to overload the CKE inline style */
|
||||
}
|
||||
&:not(:first-child) {
|
||||
margin-top: $ibo-figure--spacing-y !important; /* !important to overload the CKE inline style */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
$ibo-vertical-highlight--width: $ibo-size-100;
|
||||
$ibo-vertical-highlight--height: 100%;
|
||||
$ibo-vertical-highlight--width: $common-vertical-highlight--width;
|
||||
$ibo-vertical-highlight--height: $common-vertical-highlight--height;
|
||||
|
||||
@mixin ibo-vertical-highlight {
|
||||
display: block;
|
||||
|
||||
@@ -3,18 +3,19 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
$ibo-selectable--background-color: transparent !default;
|
||||
$ibo-selectable--background-color: $common-selectable--background-color !default;
|
||||
|
||||
$ibo-selectable--hover--color: $ibo-color-grey-100 !default;
|
||||
$ibo-selectable--hover--background-color: $ibo-color-grey-600 !default;
|
||||
$ibo-selectable--hover--background-opacity: 0.6 !default;
|
||||
$ibo-selectable--hover--color: $common-selectable--hover--color !default;
|
||||
$ibo-selectable--hover--background-color: $common-selectable--hover--background-color !default;
|
||||
$ibo-selectable--hover--background-opacity: $common-selectable--hover--background-opacity !default;
|
||||
|
||||
$ibo-selected--color: $ibo-color-grey-100 !default;
|
||||
$ibo-selected--background-color: $ibo-color-grey-900 !default;
|
||||
$ibo-selected--background-opacity: 0.5 !default;
|
||||
$ibo-selected--color: $common-selected--color !default;
|
||||
$ibo-selected--background-color: $common-selected--background-color !default;
|
||||
$ibo-selected--background-opacity: $common-selected--background-opacity !default;
|
||||
|
||||
$ibo-selected--hover--background-color: $common-selected--hover--background-color !default;
|
||||
$ibo-selected--hover--background-opacity: $common-selected--hover--background-opacity !default;
|
||||
|
||||
$ibo-selected--hover--background-color: $ibo-color-grey-700 !default;
|
||||
$ibo-selected--hover--background-opacity: 0.5 !default;
|
||||
@mixin ibo-selectable {
|
||||
content: ' ';
|
||||
@extend %fa-solid-base;
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
|
||||
// These are the base variables used throughout the backoffice, if you don't know what to use, these are probably good :)
|
||||
|
||||
$ibo-base-variable--text-color: $ibo-color-grey-900 !default;
|
||||
$ibo-base-variable--border-radius: $ibo-border-radius-300 !default;;
|
||||
$ibo-base-variable--text-color: $common-base-variable--text-color !default;
|
||||
$ibo-base-variable--border-radius: $common-base-variable--border-radius !default;;
|
||||
@@ -3,13 +3,13 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
$ibo-border-radius-100: 1px !default;
|
||||
$ibo-border-radius-300: 3px !default;
|
||||
$ibo-border-radius-400: 4px !default;
|
||||
$ibo-border-radius-500: 5px !default;
|
||||
$ibo-border-radius-700: 10px !default;
|
||||
$ibo-border-radius-900: 16px !default;
|
||||
$ibo-border-radius-full: 100% !default;
|
||||
$ibo-border-radius-100: $common-border-radius-100 !default;
|
||||
$ibo-border-radius-300: $common-border-radius-300 !default;
|
||||
$ibo-border-radius-400: $common-border-radius-400!default;
|
||||
$ibo-border-radius-500: $common-border-radius-500 !default;
|
||||
$ibo-border-radius-700: $common-border-radius-700 !default;
|
||||
$ibo-border-radius-900: $common-border-radius-900 !default;
|
||||
$ibo-border-radius-full: $common-border-radius-full !default;
|
||||
|
||||
:root{
|
||||
--ibo-border-radius-100: #{$ibo-border-radius-100};
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
$ibo-depression-100: inset 0 1px 1px 0 rgba(0, 0, 0, 0.15) !default;
|
||||
$ibo-depression-100: $common-depression-100 !default;
|
||||
|
||||
:root{
|
||||
--ibo-elevation-100: #{$ibo-depression-100};
|
||||
--ibo-depression-100: #{$ibo-depression-100};
|
||||
}
|
||||
@@ -3,11 +3,11 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
$ibo-elevation-100: 0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12) !default;
|
||||
$ibo-elevation-200: 0 2px 4px rgba(0, 0, 0, 0.12), 0 3px 6px rgba(0, 0, 0, 0.15) !default;
|
||||
$ibo-elevation-300: 0 3px 6px rgba(0, 0, 0, 0.10), 0 10px 20px rgba(0, 0, 0, 0.15) !default;
|
||||
$ibo-elevation-400: 0 5px 10px rgba(0, 0, 0, 0.05), 0 15px 25px rgba(0, 0, 0, 0.15) !default;
|
||||
$ibo-elevation-500: 0 20px 40px rgba(0, 0, 0, 0.20) !default;
|
||||
$ibo-elevation-100: $common-elevation-100 !default;
|
||||
$ibo-elevation-200: $common-elevation-200 !default;
|
||||
$ibo-elevation-300: $common-elevation-300 !default;
|
||||
$ibo-elevation-400: $common-elevation-400 !default;
|
||||
$ibo-elevation-500: $common-elevation-500 !default;
|
||||
|
||||
:root{
|
||||
--ibo-elevation-100: #{$ibo-elevation-100};
|
||||
|
||||
@@ -3,4 +3,3 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
$approot-relative: '../../../../' !default;
|
||||
|
||||
@@ -3,25 +3,25 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
$ibo-size-0: 0 !default;
|
||||
$ibo-size-50: 2px !default;
|
||||
$ibo-size-100: 4px !default;
|
||||
$ibo-size-150: 8px !default;
|
||||
$ibo-size-200: 12px !default;
|
||||
$ibo-size-250: 16px !default;
|
||||
$ibo-size-300: 24px !default;
|
||||
$ibo-size-350: 32px !default;
|
||||
$ibo-size-400: 48px !default;
|
||||
$ibo-size-450: 64px !default;
|
||||
$ibo-size-500: 96px !default;
|
||||
$ibo-size-550: 128px !default;
|
||||
$ibo-size-600: 192px !default;
|
||||
$ibo-size-650: 256px !default;
|
||||
$ibo-size-700: 384px !default;
|
||||
$ibo-size-750: 512px !default;
|
||||
$ibo-size-800: 640px !default;
|
||||
$ibo-size-850: 768px !default;
|
||||
$ibo-size-900: 896px !default;
|
||||
$ibo-size-0: $common-size-0 !default;
|
||||
$ibo-size-50: $common-size-50 !default;
|
||||
$ibo-size-100: $common-size-100 !default;
|
||||
$ibo-size-150: $common-size-150 !default;
|
||||
$ibo-size-200: $common-size-200 !default;
|
||||
$ibo-size-250: $common-size-250 !default;
|
||||
$ibo-size-300: $common-size-300 !default;
|
||||
$ibo-size-350: $common-size-350 !default;
|
||||
$ibo-size-400: $common-size-400 !default;
|
||||
$ibo-size-450: $common-size-450 !default;
|
||||
$ibo-size-500: $common-size-500 !default;
|
||||
$ibo-size-550: $common-size-550 !default;
|
||||
$ibo-size-600: $common-size-600 !default;
|
||||
$ibo-size-650: $common-size-650 !default;
|
||||
$ibo-size-700: $common-size-700 !default;
|
||||
$ibo-size-750: $common-size-750 !default;
|
||||
$ibo-size-800: $common-size-800 !default;
|
||||
$ibo-size-850: $common-size-850 !default;
|
||||
$ibo-size-900: $common-size-900 !default;
|
||||
|
||||
:root{
|
||||
--ibo-size-0: #{$ibo-size-0};
|
||||
|
||||
@@ -3,27 +3,28 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
$ibo-spacing-0: $ibo-size-0 !default;
|
||||
$ibo-spacing-100: $ibo-size-50 !default;
|
||||
$ibo-spacing-200: $ibo-size-100 !default;
|
||||
$ibo-spacing-300: $ibo-size-150 !default;
|
||||
$ibo-spacing-400: $ibo-size-200 !default;
|
||||
$ibo-spacing-500: $ibo-size-250 !default;
|
||||
$ibo-spacing-600: $ibo-size-300 !default;
|
||||
$ibo-spacing-700: $ibo-size-350 !default;
|
||||
$ibo-spacing-800: $ibo-size-400 !default;
|
||||
$ibo-spacing-900: $ibo-size-450 !default;
|
||||
$ibo-spacing-950: $ibo-size-500 !default;
|
||||
$ibo-spacing-0: $common-spacing-0 !default;
|
||||
$ibo-spacing-100: $common-spacing-100 !default;
|
||||
$ibo-spacing-200: $common-spacing-200 !default;
|
||||
$ibo-spacing-300: $common-spacing-300 !default;
|
||||
$ibo-spacing-400: $common-spacing-400 !default;
|
||||
$ibo-spacing-500: $common-spacing-500 !default;
|
||||
$ibo-spacing-600: $common-spacing-600 !default;
|
||||
$ibo-spacing-700: $common-spacing-700 !default;
|
||||
$ibo-spacing-800: $common-spacing-800 !default;
|
||||
$ibo-spacing-900: $common-spacing-900 !default;
|
||||
$ibo-spacing-950: $common-spacing-950 !default;
|
||||
|
||||
:root{
|
||||
--ibo-spacing-0: #{$ibo-size-0};
|
||||
--ibo-spacing-100: #{$ibo-size-50};
|
||||
--ibo-spacing-200: #{$ibo-size-100};
|
||||
--ibo-spacing-300: #{$ibo-size-150};
|
||||
--ibo-spacing-400: #{$ibo-size-200};
|
||||
--ibo-spacing-500: #{$ibo-size-250};
|
||||
--ibo-spacing-600: #{$ibo-size-300};
|
||||
--ibo-spacing-700: #{$ibo-size-350};
|
||||
--ibo-spacing-800: #{$ibo-size-400};
|
||||
--ibo-spacing-900: #{$ibo-size-450};
|
||||
--ibo-spacing-0: #{$ibo-spacing-0};
|
||||
--ibo-spacing-100: #{$ibo-spacing-100};
|
||||
--ibo-spacing-200: #{$ibo-spacing-200};
|
||||
--ibo-spacing-300: #{$ibo-spacing-300};
|
||||
--ibo-spacing-400: #{$ibo-spacing-400};
|
||||
--ibo-spacing-500: #{$ibo-spacing-500};
|
||||
--ibo-spacing-600: #{$ibo-spacing-600};
|
||||
--ibo-spacing-700: #{$ibo-spacing-700};
|
||||
--ibo-spacing-800: #{$ibo-spacing-800};
|
||||
--ibo-spacing-900: #{$ibo-spacing-900};
|
||||
--ibo-spacing-950: #{$ibo-spacing-950};
|
||||
}
|
||||
@@ -4,38 +4,38 @@
|
||||
*/
|
||||
|
||||
/* Base size: html font-size 12px */
|
||||
$ibo-font-size-20: 0.67rem !default; /* 8px */
|
||||
$ibo-font-size-50: 0.83rem !default; /* 10px */
|
||||
$ibo-font-size-100: 1rem !default; /* 12px */
|
||||
$ibo-font-size-150: 1.17rem !default; /* 14px */
|
||||
$ibo-font-size-200: 1.33rem !default; /* 16px */
|
||||
$ibo-font-size-250: 1.5rem !default; /* 18px */
|
||||
$ibo-font-size-300: 1.67rem !default; /* 20px */
|
||||
$ibo-font-size-350: 1.83rem !default; /* 22px */
|
||||
$ibo-font-size-400: 2rem !default; /* 24px */
|
||||
$ibo-font-size-450: 2.5rem !default; /* 30px */
|
||||
$ibo-font-size-500: 3rem !default; /* 36px */
|
||||
$ibo-font-size-550: 4rem !default; /* 48px */
|
||||
$ibo-font-size-600: 5rem !default; /* 60px */
|
||||
$ibo-font-size-650: 6rem !default; /* 72px */
|
||||
$ibo-font-size-700: 7rem !default; /* 84px */
|
||||
$ibo-font-size-20: $common-font-size-20 !default; /* 8px */
|
||||
$ibo-font-size-50: $common-font-size-50 !default; /* 10px */
|
||||
$ibo-font-size-100: $common-font-size-100 !default; /* 12px */
|
||||
$ibo-font-size-150: $common-font-size-150 !default; /* 14px */
|
||||
$ibo-font-size-200: $common-font-size-200 !default; /* 16px */
|
||||
$ibo-font-size-250: $common-font-size-250 !default; /* 18px */
|
||||
$ibo-font-size-300: $common-font-size-300 !default; /* 20px */
|
||||
$ibo-font-size-350: $common-font-size-350 !default; /* 22px */
|
||||
$ibo-font-size-400: $common-font-size-400 !default; /* 24px */
|
||||
$ibo-font-size-450: $common-font-size-450 !default; /* 30px */
|
||||
$ibo-font-size-500: $common-font-size-500 !default; /* 36px */
|
||||
$ibo-font-size-550: $common-font-size-550 !default; /* 48px */
|
||||
$ibo-font-size-600: $common-font-size-600 !default; /* 60px */
|
||||
$ibo-font-size-650: $common-font-size-650 !default; /* 72px */
|
||||
$ibo-font-size-700: $common-font-size-700 !default; /* 84px */
|
||||
|
||||
/* Value Common weight name (https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight) */
|
||||
$ibo-font-weight-100: 100 !default; /* 100 Thin (Harline) */
|
||||
$ibo-font-weight-200: 200 !default; /* 200 Extra Light (Ultra Light) */
|
||||
$ibo-font-weight-300: 300 !default; /* 300 Light */
|
||||
$ibo-font-weight-400: 400 !default; /* 400 Normal (Regular) */
|
||||
$ibo-font-weight-500: 500 !default; /* 500 Medium */
|
||||
$ibo-font-weight-600: 600 !default; /* 600 Semi Bold (Demi Bold) */
|
||||
$ibo-font-weight-700: 700 !default; /* 700 Bold */
|
||||
$ibo-font-weight-800: 800 !default; /* 800 Extra Bold (Ultra Bold) */
|
||||
$ibo-font-weight-900: 900 !default; /* 900 Black (Heavy) */
|
||||
$ibo-font-weight-950: 950 !default; /* 950 Extra Black (Ultra Black) */
|
||||
$ibo-font-weight-100: $common-font-weight-100 !default; /* 100 Thin (Harline) */
|
||||
$ibo-font-weight-200: $common-font-weight-200 !default; /* 200 Extra Light (Ultra Light) */
|
||||
$ibo-font-weight-300: $common-font-weight-300 !default; /* 300 Light */
|
||||
$ibo-font-weight-400: $common-font-weight-400 !default; /* 400 Normal (Regular) */
|
||||
$ibo-font-weight-500: $common-font-weight-500 !default; /* 500 Medium */
|
||||
$ibo-font-weight-600: $common-font-weight-600 !default; /* 600 Semi Bold (Demi Bold) */
|
||||
$ibo-font-weight-700: $common-font-weight-700 !default; /* 700 Bold */
|
||||
$ibo-font-weight-800: $common-font-weight-800 !default; /* 800 Extra Bold (Ultra Bold) */
|
||||
$ibo-font-weight-900: $common-font-weight-900 !default; /* 900 Black (Heavy) */
|
||||
$ibo-font-weight-950: $common-font-weight-950 !default; /* 950 Extra Black (Ultra Black) */
|
||||
|
||||
$ibo-font-family-base: "Raleway" !default;
|
||||
$ibo-font-family-fallbacks: "sans-serif", "system-ui" !default;
|
||||
$ibo-font-family-monospace: monospace !default;
|
||||
$ibo-font-family-code: $ibo-font-family-monospace !default;
|
||||
$ibo-font-family-base: $common-font-family-base !default;
|
||||
$ibo-font-family-fallbacks: $common-font-family-fallbacks !default;
|
||||
$ibo-font-family-monospace: $common-font-family-monospace !default;
|
||||
$ibo-font-family-code: $common-font-family-code !default;
|
||||
|
||||
:root {
|
||||
--ibo-font-size-50: #{$ibo-font-size-50};
|
||||
|
||||
@@ -4,102 +4,102 @@
|
||||
*/
|
||||
|
||||
/* Base color palettes */
|
||||
$ibo-color-white-100: hsla(0, 0%, 100%, 1) !default;
|
||||
$ibo-color-white-200: hsla(0, 0%, 94.9%, 1) !default;
|
||||
$ibo-color-transparent: hsla(0, 0%, 100%, 0) !default;
|
||||
$ibo-color-white-100: $common-color-white-100 !default;
|
||||
$ibo-color-white-200: $common-color-white-200 !default;
|
||||
$ibo-color-transparent: $common-color-transparent !default;
|
||||
|
||||
$ibo-color-grey-50: hsla(240, 20%, 99%, 1) !default;
|
||||
$ibo-color-grey-100: hsla(210, 16.7%, 97.6%, 1) !default;
|
||||
$ibo-color-grey-200: hsla(207, 22.4%, 90.4%, 1) !default;
|
||||
$ibo-color-grey-300: hsla(210, 23.5%, 86.7%, 1) !default;
|
||||
$ibo-color-grey-400: hsla(208, 17.2%, 82.9%, 1) !default;
|
||||
$ibo-color-grey-500: hsla(209, 23.7%, 74.3%, 1) !default;
|
||||
$ibo-color-grey-600: hsla(215, 16.6%, 63.3%, 1) !default;
|
||||
$ibo-color-grey-700: hsla(214, 11.3%, 48.6%, 1) !default;
|
||||
$ibo-color-grey-800: hsla(215, 16.9%, 30.2%, 1) !default;
|
||||
$ibo-color-grey-900: hsla(215, 22.4%, 16.7%, 1) !default;
|
||||
$ibo-color-grey-950: hsla(215, 26.4%, 10.7%, 1) !default;
|
||||
$ibo-color-grey-50: $common-color-grey-50 !default;
|
||||
$ibo-color-grey-100: $common-color-grey-100 !default;
|
||||
$ibo-color-grey-200: $common-color-grey-200 !default;
|
||||
$ibo-color-grey-300: $common-color-grey-300 !default;
|
||||
$ibo-color-grey-400: $common-color-grey-400 !default;
|
||||
$ibo-color-grey-500: $common-color-grey-500 !default;
|
||||
$ibo-color-grey-600: $common-color-grey-600 !default;
|
||||
$ibo-color-grey-700: $common-color-grey-700 !default;
|
||||
$ibo-color-grey-800: $common-color-grey-800 !default;
|
||||
$ibo-color-grey-900: $common-color-grey-900 !default;
|
||||
$ibo-color-grey-950: $common-color-grey-950 !default;
|
||||
|
||||
$ibo-color-blue-grey-50: hsla(210, 36%, 96%, 1) !default;
|
||||
$ibo-color-blue-grey-100: hsla(198, 15.7%, 83.7%, 1) !default;
|
||||
$ibo-color-blue-grey-200: hsla(200, 15.3%, 73.1%, 1) !default;
|
||||
$ibo-color-blue-grey-300: hsla(200, 15.6%, 62.4%, 1) !default;
|
||||
$ibo-color-blue-grey-400: hsla(200, 15.4%, 54.1%, 1) !default;
|
||||
$ibo-color-blue-grey-500: hsla(200, 18.3%, 46.1%, 1) !default;
|
||||
$ibo-color-blue-grey-600: hsla(199, 18.4%, 40.4%, 1) !default;
|
||||
$ibo-color-blue-grey-700: hsla(199, 18.3%, 33.1%, 1) !default;
|
||||
$ibo-color-blue-grey-800: hsla(200, 17.9%, 26.3%, 1) !default;
|
||||
$ibo-color-blue-grey-900: hsla(200, 19.1%, 18.4%, 1) !default;
|
||||
$ibo-color-blue-grey-950: hsla(200, 20.2%, 13.1%, 1) !default;
|
||||
$ibo-color-blue-grey-50: $common-color-blue-grey-50 !default;
|
||||
$ibo-color-blue-grey-100: $common-color-blue-grey-100 !default;
|
||||
$ibo-color-blue-grey-200: $common-color-blue-grey-200 !default;
|
||||
$ibo-color-blue-grey-300: $common-color-blue-grey-300 !default;
|
||||
$ibo-color-blue-grey-400: $common-color-blue-grey-400 !default;
|
||||
$ibo-color-blue-grey-500: $common-color-blue-grey-500 !default;
|
||||
$ibo-color-blue-grey-600: $common-color-blue-grey-600 !default;
|
||||
$ibo-color-blue-grey-700: $common-color-blue-grey-700 !default;
|
||||
$ibo-color-blue-grey-800: $common-color-blue-grey-800 !default;
|
||||
$ibo-color-blue-grey-900: $common-color-blue-grey-900 !default;
|
||||
$ibo-color-blue-grey-950: $common-color-blue-grey-950 !default;
|
||||
|
||||
$ibo-color-blue-100: hsla(201, 100%, 96.1%, 1) !default;
|
||||
$ibo-color-blue-200: hsla(202, 80.6%, 85.9%, 1) !default;
|
||||
$ibo-color-blue-300: hsla(203, 82%, 76.1%, 1) !default;
|
||||
$ibo-color-blue-400: hsla(205, 79.3%, 65.9%, 1) !default;
|
||||
$ibo-color-blue-500: hsla(207, 72.6%, 57.1%, 1) !default;
|
||||
$ibo-color-blue-600: hsla(209, 61.6%, 50%, 1) !default;
|
||||
$ibo-color-blue-700: hsla(211, 60.7%, 42.9%, 1) !default;
|
||||
$ibo-color-blue-800: hsla(213, 49.4%, 34.1%, 1) !default;
|
||||
$ibo-color-blue-900: hsla(215, 41.3%, 28%, 1) !default;
|
||||
$ibo-color-blue-950: hsla(215, 36.8%, 23%, 1) !default;
|
||||
$ibo-color-blue-100: $common-color-blue-100 !default;
|
||||
$ibo-color-blue-200: $common-color-blue-200 !default;
|
||||
$ibo-color-blue-300: $common-color-blue-300 !default;
|
||||
$ibo-color-blue-400: $common-color-blue-400 !default;
|
||||
$ibo-color-blue-500: $common-color-blue-500 !default;
|
||||
$ibo-color-blue-600: $common-color-blue-600 !default;
|
||||
$ibo-color-blue-700: $common-color-blue-700 !default;
|
||||
$ibo-color-blue-800: $common-color-blue-800 !default;
|
||||
$ibo-color-blue-900: $common-color-blue-900 !default;
|
||||
$ibo-color-blue-950: $common-color-blue-950 !default;
|
||||
|
||||
$ibo-color-cyan-100: hsla(186, 61.2%, 86.9%, 1) !default;
|
||||
$ibo-color-cyan-200: hsla(187, 71.6%, 71%, 1) !default;
|
||||
$ibo-color-cyan-300: hsla(187, 71.2%, 59.2%, 1) !default;
|
||||
$ibo-color-cyan-400: hsla(187, 70.9%, 50.2%, 1) !default;
|
||||
$ibo-color-cyan-500: hsla(187, 100%, 41.6%, 1) !default;
|
||||
$ibo-color-cyan-600: hsla(187, 100%, 37.8%, 1) !default;
|
||||
$ibo-color-cyan-700: hsla(186, 100%, 32.7%, 1) !default;
|
||||
$ibo-color-cyan-800: hsla(185, 100%, 28%, 1) !default;
|
||||
$ibo-color-cyan-900: hsla(182, 100%, 19.6%, 1) !default;
|
||||
$ibo-color-cyan-950: hsla(180, 100%, 10.6%, 1) !default;
|
||||
$ibo-color-cyan-100: $common-color-cyan-100 !default;
|
||||
$ibo-color-cyan-200: $common-color-cyan-200 !default;
|
||||
$ibo-color-cyan-300: $common-color-cyan-300 !default;
|
||||
$ibo-color-cyan-400: $common-color-cyan-400 !default;
|
||||
$ibo-color-cyan-500: $common-color-cyan-500 !default;
|
||||
$ibo-color-cyan-600: $common-color-cyan-600 !default;
|
||||
$ibo-color-cyan-700: $common-color-cyan-700 !default;
|
||||
$ibo-color-cyan-800: $common-color-cyan-800 !default;
|
||||
$ibo-color-cyan-900: $common-color-cyan-900 !default;
|
||||
$ibo-color-cyan-950: $common-color-cyan-950 !default;
|
||||
|
||||
$ibo-color-green-100: hsla(88, 50.7%, 85.7%, 1) !default;
|
||||
$ibo-color-green-200: hsla(88, 50%, 76.5%, 1) !default;
|
||||
$ibo-color-green-300: hsla(88, 50%, 67.1%, 1) !default;
|
||||
$ibo-color-green-400: hsla(88, 50.2%, 59.8%, 1) !default;
|
||||
$ibo-color-green-500: hsla(88, 50.2%, 52.7%, 1) !default;
|
||||
$ibo-color-green-600: hsla(89, 46.1%, 48%, 1) !default;
|
||||
$ibo-color-green-700: hsla(92, 47.9%, 42.2%, 1) !default;
|
||||
$ibo-color-green-800: hsla(95, 49.5%, 36.5%, 1) !default;
|
||||
$ibo-color-green-900: hsla(103, 55.6%, 26.5%, 1) !default;
|
||||
$ibo-color-green-950: hsla(108, 59.6%, 21.5%, 1) !default;
|
||||
$ibo-color-green-100: $common-color-green-100 !default;
|
||||
$ibo-color-green-200: $common-color-green-200 !default;
|
||||
$ibo-color-green-300: $common-color-green-300 !default;
|
||||
$ibo-color-green-400: $common-color-green-400 !default;
|
||||
$ibo-color-green-500: $common-color-green-500 !default;
|
||||
$ibo-color-green-600: $common-color-green-600 !default;
|
||||
$ibo-color-green-700: $common-color-green-700 !default;
|
||||
$ibo-color-green-800: $common-color-green-800 !default;
|
||||
$ibo-color-green-900: $common-color-green-900 !default;
|
||||
$ibo-color-green-950: $common-color-green-950 !default;
|
||||
|
||||
|
||||
$ibo-color-orange-100: hsla(40, 100%, 97.1%, 1) !default;
|
||||
$ibo-color-orange-200: hsla(39, 96.4%, 89%, 1) !default;
|
||||
$ibo-color-orange-300: hsla(38, 93.2%, 76.9%, 1) !default;
|
||||
$ibo-color-orange-400: hsla(33, 89.9%, 64.9%, 1) !default;
|
||||
$ibo-color-orange-500: hsla(28, 82.9%, 51.8%, 1) !default;
|
||||
$ibo-color-orange-600: hsla(24, 74.7%, 49.6%, 1) !default;
|
||||
$ibo-color-orange-700: hsla(20, 70.7%, 44.1%, 1) !default;
|
||||
$ibo-color-orange-800: hsla(16, 65.1%, 37.1%, 1) !default;
|
||||
$ibo-color-orange-900: hsla(14, 60.8%, 30%, 1) !default;
|
||||
$ibo-color-orange-950: hsla(14, 55.1%, 22%, 1) !default;
|
||||
$ibo-color-orange-100: $common-color-orange-100 !default;
|
||||
$ibo-color-orange-200: $common-color-orange-200 !default;
|
||||
$ibo-color-orange-300: $common-color-orange-300 !default;
|
||||
$ibo-color-orange-400: $common-color-orange-400 !default;
|
||||
$ibo-color-orange-500: $common-color-orange-500 !default;
|
||||
$ibo-color-orange-600: $common-color-orange-600 !default;
|
||||
$ibo-color-orange-700: $common-color-orange-700 !default;
|
||||
$ibo-color-orange-800: $common-color-orange-800 !default;
|
||||
$ibo-color-orange-900: $common-color-orange-900 !default;
|
||||
$ibo-color-orange-950: $common-color-orange-950 !default;
|
||||
|
||||
$ibo-color-red-100: hsla(0, 76.9%, 94.9%, 1) !default;
|
||||
$ibo-color-red-200: hsla(0, 95.1%, 92%, 1) !default;
|
||||
$ibo-color-red-300: hsla(0, 97.4%, 84.7%, 1) !default;
|
||||
$ibo-color-red-400: hsla(0, 95.3%, 74.7%, 1) !default;
|
||||
$ibo-color-red-500: hsla(0, 87.8%, 67.8%, 1) !default;
|
||||
$ibo-color-red-600: hsla(0, 76.3%, 57.1%, 1) !default;
|
||||
$ibo-color-red-700: hsla(0, 60.8%, 48%, 1) !default;
|
||||
$ibo-color-red-800: hsla(0, 55.8%, 39%, 1) !default;
|
||||
$ibo-color-red-900: hsla(0, 46.8%, 31%, 1) !default;
|
||||
$ibo-color-red-950: hsla(0, 42.9%, 20%, 1) !default;
|
||||
$ibo-color-red-100: $common-color-red-100 !default;
|
||||
$ibo-color-red-200: $common-color-red-200 !default;
|
||||
$ibo-color-red-300: $common-color-red-300 !default;
|
||||
$ibo-color-red-400: $common-color-red-400 !default;
|
||||
$ibo-color-red-500: $common-color-red-500 !default;
|
||||
$ibo-color-red-600: $common-color-red-600 !default;
|
||||
$ibo-color-red-700: $common-color-red-700 !default;
|
||||
$ibo-color-red-800: $common-color-red-800 !default;
|
||||
$ibo-color-red-900: $common-color-red-900 !default;
|
||||
$ibo-color-red-950: $common-color-red-950 !default;
|
||||
|
||||
$ibo-color-pink-100: hsla(348, 100%, 98%, 1) !default;
|
||||
$ibo-color-pink-200: hsla(343, 95%, 92%, 1) !default;
|
||||
$ibo-color-pink-300: hsla(339, 90%, 85%, 1) !default;
|
||||
$ibo-color-pink-400: hsla(336, 86%, 75%, 1) !default;
|
||||
$ibo-color-pink-500: hsla(331, 79%, 66%, 1) !default;
|
||||
$ibo-color-pink-600: hsla(329, 64%, 54%, 1) !default;
|
||||
$ibo-color-pink-700: hsla(325, 57%, 46%, 1) !default;
|
||||
$ibo-color-pink-800: hsla(322, 60%, 37%, 1) !default;
|
||||
$ibo-color-pink-900: hsla(318, 51%, 29%, 1) !default;
|
||||
$ibo-color-pink-950: hsla(318, 51%, 21%, 1) !default;
|
||||
$ibo-color-pink-100: $common-color-pink-100 !default;
|
||||
$ibo-color-pink-200: $common-color-pink-200 !default;
|
||||
$ibo-color-pink-300: $common-color-pink-300 !default;
|
||||
$ibo-color-pink-400: $common-color-pink-400 !default;
|
||||
$ibo-color-pink-500: $common-color-pink-500 !default;
|
||||
$ibo-color-pink-600: $common-color-pink-600 !default;
|
||||
$ibo-color-pink-700: $common-color-pink-700 !default;
|
||||
$ibo-color-pink-800: $common-color-pink-800 !default;
|
||||
$ibo-color-pink-900: $common-color-pink-900 !default;
|
||||
$ibo-color-pink-950: $common-color-pink-950 !default;
|
||||
|
||||
$ibo-colors: ('grey', 'blue-grey', 'blue', 'cyan', 'green', 'orange', 'red', 'pink', 'primary', 'secondary', 'information', 'success', 'warning', 'danger');
|
||||
$ibo-colors: $common-colors;
|
||||
|
||||
/* CSS variables */
|
||||
:root{
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
|
||||
/* Base helpers for colors */
|
||||
/* - These lightness vars are used to force a certain lightness on HSLA colors */
|
||||
$ibo-color-base-lightness-100: 93% !default;
|
||||
$ibo-color-base-lightness-900: 15% !default;
|
||||
$ibo-color-base-lightness-100: $common-color-base-lightness-100 !default;
|
||||
$ibo-color-base-lightness-900: $common-color-base-lightness-900 !default;
|
||||
|
||||
$ibo-color-base-opacity-for-lightness-100: 1 !default;
|
||||
$ibo-color-base-opacity-for-lightness-900: 1 !default;
|
||||
$ibo-color-base-opacity-for-lightness-100: $common-color-base-opacity-for-lightness-100 !default;
|
||||
$ibo-color-base-opacity-for-lightness-900: $common-color-base-opacity-for-lightness-900 !default;
|
||||
@@ -5,24 +5,24 @@
|
||||
|
||||
/* Lifecycle palette */
|
||||
/* - For workflow */
|
||||
$ibo-lifecycle-new-state-primary-color: $ibo-color-blue-800 !default;
|
||||
$ibo-lifecycle-new-state-secondary-color: $ibo-color-white-100 !default;
|
||||
$ibo-lifecycle-neutral-state-primary-color: $ibo-color-blue-800 !default;
|
||||
$ibo-lifecycle-neutral-state-secondary-color: $ibo-color-white-100 !default;
|
||||
$ibo-lifecycle-waiting-state-primary-color: $ibo-color-orange-400 !default;
|
||||
$ibo-lifecycle-waiting-state-secondary-color: $ibo-color-white-100 !default;
|
||||
$ibo-lifecycle-success-state-primary-color: $ibo-color-green-700 !default;
|
||||
$ibo-lifecycle-success-state-secondary-color: $ibo-color-white-100 !default;
|
||||
$ibo-lifecycle-failure-state-primary-color: $ibo-color-pink-700 !default;
|
||||
$ibo-lifecycle-failure-state-secondary-color: $ibo-color-white-100 !default;
|
||||
$ibo-lifecycle-frozen-state-primary-color: $ibo-color-grey-200 !default;
|
||||
$ibo-lifecycle-frozen-state-secondary-color: $ibo-color-grey-700 !default;
|
||||
$ibo-lifecycle-new-state-primary-color: $common-lifecycle-new-state-primary-color !default;
|
||||
$ibo-lifecycle-new-state-secondary-color: $common-lifecycle-new-state-secondary-color !default;
|
||||
$ibo-lifecycle-neutral-state-primary-color: $common-lifecycle-neutral-state-primary-color !default;
|
||||
$ibo-lifecycle-neutral-state-secondary-color: $common-lifecycle-neutral-state-secondary-color !default;
|
||||
$ibo-lifecycle-waiting-state-primary-color: $common-lifecycle-waiting-state-primary-color !default;
|
||||
$ibo-lifecycle-waiting-state-secondary-color: $common-lifecycle-waiting-state-secondary-color !default;
|
||||
$ibo-lifecycle-success-state-primary-color: $common-lifecycle-success-state-primary-color !default;
|
||||
$ibo-lifecycle-success-state-secondary-color: $common-lifecycle-success-state-secondary-color !default;
|
||||
$ibo-lifecycle-failure-state-primary-color: $common-lifecycle-failure-state-primary-color !default;
|
||||
$ibo-lifecycle-failure-state-secondary-color: $common-lifecycle-failure-state-secondary-color !default;
|
||||
$ibo-lifecycle-frozen-state-primary-color: $common-lifecycle-frozen-state-primary-color !default;
|
||||
$ibo-lifecycle-frozen-state-secondary-color: $common-lifecycle-frozen-state-secondary-color !default;
|
||||
|
||||
/* - For basic lifecycle */
|
||||
$ibo-lifecycle-active-state-primary-color: $ibo-color-green-700 !default;
|
||||
$ibo-lifecycle-active-state-secondary-color: $ibo-color-white-100 !default;
|
||||
$ibo-lifecycle-inactive-state-primary-color: $ibo-color-orange-400 !default;
|
||||
$ibo-lifecycle-inactive-state-secondary-color: $ibo-color-white-100 !default;
|
||||
$ibo-lifecycle-active-state-primary-color: $common-lifecycle-active-state-primary-color !default;
|
||||
$ibo-lifecycle-active-state-secondary-color: $common-lifecycle-active-state-secondary-color !default;
|
||||
$ibo-lifecycle-inactive-state-primary-color: $common-lifecycle-inactive-state-primary-color !default;
|
||||
$ibo-lifecycle-inactive-state-secondary-color: $common-lifecycle-inactive-state-secondary-color !default;
|
||||
|
||||
$ibo-lifecycle-states-colors: (
|
||||
'new': (
|
||||
|
||||
@@ -5,99 +5,99 @@
|
||||
|
||||
/* Semantic palettes */
|
||||
/* - Primary color of the brand */
|
||||
$ibo-color-primary-100: $ibo-color-orange-100 !default;
|
||||
$ibo-color-primary-200: $ibo-color-orange-200 !default;
|
||||
$ibo-color-primary-300: $ibo-color-orange-300 !default;
|
||||
$ibo-color-primary-400: $ibo-color-orange-400 !default;
|
||||
$ibo-color-primary-500: $ibo-color-orange-500 !default;
|
||||
$ibo-color-primary-600: $ibo-color-orange-600 !default;
|
||||
$ibo-color-primary-700: $ibo-color-orange-700 !default;
|
||||
$ibo-color-primary-800: $ibo-color-orange-800 !default;
|
||||
$ibo-color-primary-900: $ibo-color-orange-900 !default;
|
||||
$ibo-color-primary-950: $ibo-color-orange-950 !default;
|
||||
$ibo-color-primary-100: $common-color-primary-100 !default;
|
||||
$ibo-color-primary-200: $common-color-primary-200 !default;
|
||||
$ibo-color-primary-300: $common-color-primary-300 !default;
|
||||
$ibo-color-primary-400: $common-color-primary-400 !default;
|
||||
$ibo-color-primary-500: $common-color-primary-500 !default;
|
||||
$ibo-color-primary-600: $common-color-primary-600 !default;
|
||||
$ibo-color-primary-700: $common-color-primary-700 !default;
|
||||
$ibo-color-primary-800: $common-color-primary-800 !default;
|
||||
$ibo-color-primary-900: $common-color-primary-900 !default;
|
||||
$ibo-color-primary-950: $common-color-primary-950 !default;
|
||||
|
||||
/* - Secondary color of the brand */
|
||||
$ibo-color-secondary-100: $ibo-color-grey-100 !default;
|
||||
$ibo-color-secondary-200: $ibo-color-grey-200 !default;
|
||||
$ibo-color-secondary-300: $ibo-color-grey-300 !default;
|
||||
$ibo-color-secondary-400: $ibo-color-grey-400 !default;
|
||||
$ibo-color-secondary-500: $ibo-color-grey-500 !default;
|
||||
$ibo-color-secondary-600: $ibo-color-grey-600 !default;
|
||||
$ibo-color-secondary-700: $ibo-color-grey-700 !default;
|
||||
$ibo-color-secondary-800: $ibo-color-grey-800 !default;
|
||||
$ibo-color-secondary-900: $ibo-color-grey-900 !default;
|
||||
$ibo-color-secondary-950: $ibo-color-grey-950 !default;
|
||||
$ibo-color-secondary-100: $common-color-secondary-100 !default;
|
||||
$ibo-color-secondary-200: $common-color-secondary-200 !default;
|
||||
$ibo-color-secondary-300: $common-color-secondary-300 !default;
|
||||
$ibo-color-secondary-400: $common-color-secondary-400 !default;
|
||||
$ibo-color-secondary-500: $common-color-secondary-500 !default;
|
||||
$ibo-color-secondary-600: $common-color-secondary-600 !default;
|
||||
$ibo-color-secondary-700: $common-color-secondary-700 !default;
|
||||
$ibo-color-secondary-800: $common-color-secondary-800 !default;
|
||||
$ibo-color-secondary-900: $common-color-secondary-900 !default;
|
||||
$ibo-color-secondary-950: $common-color-secondary-950 !default;
|
||||
|
||||
/* - Information: messages / actions that should neither seem as success, warning or failure */
|
||||
$ibo-color-information-100: $ibo-color-blue-100 !default;
|
||||
$ibo-color-information-200: $ibo-color-blue-200 !default;
|
||||
$ibo-color-information-300: $ibo-color-blue-300 !default;
|
||||
$ibo-color-information-400: $ibo-color-blue-400 !default;
|
||||
$ibo-color-information-500: $ibo-color-blue-500 !default;
|
||||
$ibo-color-information-600: $ibo-color-blue-600 !default;
|
||||
$ibo-color-information-700: $ibo-color-blue-700 !default;
|
||||
$ibo-color-information-800: $ibo-color-blue-800 !default;
|
||||
$ibo-color-information-900: $ibo-color-blue-900 !default;
|
||||
$ibo-color-information-950: $ibo-color-blue-950 !default;
|
||||
$ibo-color-information-100: $common-color-information-100 !default;
|
||||
$ibo-color-information-200: $common-color-information-200 !default;
|
||||
$ibo-color-information-300: $common-color-information-300 !default;
|
||||
$ibo-color-information-400: $common-color-information-400 !default;
|
||||
$ibo-color-information-500: $common-color-information-500 !default;
|
||||
$ibo-color-information-600: $common-color-information-600 !default;
|
||||
$ibo-color-information-700: $common-color-information-700 !default;
|
||||
$ibo-color-information-800: $common-color-information-800 !default;
|
||||
$ibo-color-information-900: $common-color-information-900 !default;
|
||||
$ibo-color-information-950: $common-color-information-950 !default;
|
||||
|
||||
/* Success: messages of success, safe actions, ... */
|
||||
$ibo-color-success-100: $ibo-color-green-100 !default;
|
||||
$ibo-color-success-200: $ibo-color-green-200 !default;
|
||||
$ibo-color-success-300: $ibo-color-green-300 !default;
|
||||
$ibo-color-success-400: $ibo-color-green-400 !default;
|
||||
$ibo-color-success-500: $ibo-color-green-500 !default;
|
||||
$ibo-color-success-600: $ibo-color-green-600 !default;
|
||||
$ibo-color-success-700: $ibo-color-green-700 !default;
|
||||
$ibo-color-success-800: $ibo-color-green-800 !default;
|
||||
$ibo-color-success-900: $ibo-color-green-900 !default;
|
||||
$ibo-color-success-950: $ibo-color-green-950 !default;
|
||||
$ibo-color-success-100: $common-color-success-100 !default;
|
||||
$ibo-color-success-200: $common-color-success-200 !default;
|
||||
$ibo-color-success-300: $common-color-success-300 !default;
|
||||
$ibo-color-success-400: $common-color-success-400 !default;
|
||||
$ibo-color-success-500: $common-color-success-500 !default;
|
||||
$ibo-color-success-600: $common-color-success-600 !default;
|
||||
$ibo-color-success-700: $common-color-success-700 !default;
|
||||
$ibo-color-success-800: $common-color-success-800 !default;
|
||||
$ibo-color-success-900: $common-color-success-900 !default;
|
||||
$ibo-color-success-950: $common-color-success-950 !default;
|
||||
|
||||
/* Warning: messages of warning, actions that would be done carefully, ... */
|
||||
$ibo-color-warning-100: $ibo-color-orange-100 !default;
|
||||
$ibo-color-warning-200: $ibo-color-orange-200 !default;
|
||||
$ibo-color-warning-300: $ibo-color-orange-300 !default;
|
||||
$ibo-color-warning-400: $ibo-color-orange-400 !default;
|
||||
$ibo-color-warning-500: $ibo-color-orange-500 !default;
|
||||
$ibo-color-warning-600: $ibo-color-orange-600 !default;
|
||||
$ibo-color-warning-700: $ibo-color-orange-700 !default;
|
||||
$ibo-color-warning-800: $ibo-color-orange-800 !default;
|
||||
$ibo-color-warning-900: $ibo-color-orange-900 !default;
|
||||
$ibo-color-warning-950: $ibo-color-orange-950 !default;
|
||||
$ibo-color-warning-100: $common-color-warning-100 !default;
|
||||
$ibo-color-warning-200: $common-color-warning-200 !default;
|
||||
$ibo-color-warning-300: $common-color-warning-300 !default;
|
||||
$ibo-color-warning-400: $common-color-warning-400 !default;
|
||||
$ibo-color-warning-500: $common-color-warning-500 !default;
|
||||
$ibo-color-warning-600: $common-color-warning-600 !default;
|
||||
$ibo-color-warning-700: $common-color-warning-700 !default;
|
||||
$ibo-color-warning-800: $common-color-warning-800 !default;
|
||||
$ibo-color-warning-900: $common-color-warning-900 !default;
|
||||
$ibo-color-warning-950: $common-color-warning-950 !default;
|
||||
|
||||
/* Danger: messages of failure, error, ... */
|
||||
$ibo-color-error-100: $ibo-color-red-100 !default;
|
||||
$ibo-color-error-200: $ibo-color-red-200 !default;
|
||||
$ibo-color-error-300: $ibo-color-red-300 !default;
|
||||
$ibo-color-error-400: $ibo-color-red-400 !default;
|
||||
$ibo-color-error-500: $ibo-color-red-500 !default;
|
||||
$ibo-color-error-600: $ibo-color-red-600 !default;
|
||||
$ibo-color-error-700: $ibo-color-red-700 !default;
|
||||
$ibo-color-error-800: $ibo-color-red-800 !default;
|
||||
$ibo-color-error-900: $ibo-color-red-900 !default;
|
||||
$ibo-color-error-950: $ibo-color-red-950 !default;
|
||||
$ibo-color-error-100: $common-color-error-100 !default;
|
||||
$ibo-color-error-200: $common-color-error-200 !default;
|
||||
$ibo-color-error-300: $common-color-error-300 !default;
|
||||
$ibo-color-error-400: $common-color-error-400 !default;
|
||||
$ibo-color-error-500: $common-color-error-500 !default;
|
||||
$ibo-color-error-600: $common-color-error-600 !default;
|
||||
$ibo-color-error-700: $common-color-error-700 !default;
|
||||
$ibo-color-error-800: $common-color-error-800 !default;
|
||||
$ibo-color-error-900: $common-color-error-900 !default;
|
||||
$ibo-color-error-950: $common-color-error-950 !default;
|
||||
|
||||
/* Danger: messages of danger, actions that cannot be undone, ... */
|
||||
$ibo-color-danger-100: $ibo-color-red-100 !default;
|
||||
$ibo-color-danger-200: $ibo-color-red-200 !default;
|
||||
$ibo-color-danger-300: $ibo-color-red-300 !default;
|
||||
$ibo-color-danger-400: $ibo-color-red-400 !default;
|
||||
$ibo-color-danger-500: $ibo-color-red-500 !default;
|
||||
$ibo-color-danger-600: $ibo-color-red-600 !default;
|
||||
$ibo-color-danger-700: $ibo-color-red-700 !default;
|
||||
$ibo-color-danger-800: $ibo-color-red-800 !default;
|
||||
$ibo-color-danger-900: $ibo-color-red-900 !default;
|
||||
$ibo-color-danger-950: $ibo-color-red-950 !default;
|
||||
$ibo-color-danger-100: $common-color-danger-100 !default;
|
||||
$ibo-color-danger-200: $common-color-danger-200 !default;
|
||||
$ibo-color-danger-300: $common-color-danger-300 !default;
|
||||
$ibo-color-danger-400: $common-color-danger-400 !default;
|
||||
$ibo-color-danger-500: $common-color-danger-500 !default;
|
||||
$ibo-color-danger-600: $common-color-danger-600 !default;
|
||||
$ibo-color-danger-700: $common-color-danger-700 !default;
|
||||
$ibo-color-danger-800: $common-color-danger-800 !default;
|
||||
$ibo-color-danger-900: $common-color-danger-900 !default;
|
||||
$ibo-color-danger-950: $common-color-danger-950 !default;
|
||||
|
||||
$ibo-semantic-colors: ('primary', 'secondary', 'information', 'success', 'warning', 'danger');
|
||||
$ibo-semantic-colors: $common-semantic-colors !default;
|
||||
|
||||
$ibo-caselog-highlight-color-1: $ibo-color-green-700 !default;
|
||||
$ibo-caselog-highlight-color-2: $ibo-color-pink-700 !default;
|
||||
$ibo-caselog-highlight-color-3: $ibo-color-orange-400 !default;
|
||||
$ibo-caselog-highlight-color-4: $ibo-color-blue-600 !default;
|
||||
$ibo-caselog-highlight-color-5: $ibo-color-cyan-200 !default;
|
||||
$ibo-caselog-highlight-color-6: $ibo-color-green-200 !default;
|
||||
$ibo-caselog-highlight-color-7: $ibo-color-pink-300 !default;
|
||||
$ibo-caselog-highlight-colors: ($ibo-caselog-highlight-color-1, $ibo-caselog-highlight-color-2, $ibo-caselog-highlight-color-3, $ibo-caselog-highlight-color-4, $ibo-caselog-highlight-color-5, $ibo-caselog-highlight-color-6, $ibo-caselog-highlight-color-7) !default;
|
||||
$ibo-caselog-highlight-color-1: $common-caselog-highlight-color-1 !default;
|
||||
$ibo-caselog-highlight-color-2: $common-caselog-highlight-color-2 !default;
|
||||
$ibo-caselog-highlight-color-3: $common-caselog-highlight-color-3 !default;
|
||||
$ibo-caselog-highlight-color-4: $common-caselog-highlight-color-4 !default;
|
||||
$ibo-caselog-highlight-color-5: $common-caselog-highlight-color-5 !default;
|
||||
$ibo-caselog-highlight-color-6: $common-caselog-highlight-color-6 !default;
|
||||
$ibo-caselog-highlight-color-7: $common-caselog-highlight-color-7 !default;
|
||||
$ibo-caselog-highlight-colors: $common-caselog-highlight-colors !default;
|
||||
|
||||
/* CSS variables */
|
||||
:root {
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
/* Skeleton palette */
|
||||
/* - Colors used by skeletons svg to display placeholders */
|
||||
|
||||
$ibo-skeleton-start-color: $ibo-color-grey-200 !default;
|
||||
$ibo-skeleton-stop-color: $ibo-color-blue-grey-100 !default;
|
||||
$ibo-skeleton-start-color: $common-skeleton-start-color !default;
|
||||
$ibo-skeleton-stop-color: $common-skeleton-stop-color !default;
|
||||
|
||||
/* CSS variables */
|
||||
/* Skeleton CSS3 variables are not ibo prefixed as they are not iTop backoffice exclusives*/
|
||||
|
||||
3
css/backoffice/vendors/_all.scss
vendored
3
css/backoffice/vendors/_all.scss
vendored
@@ -8,7 +8,8 @@
|
||||
@import "../../../node_modules/bulma-scss/utilities/all";
|
||||
@import "../../../node_modules/bulma-scss/base/all";
|
||||
@import "../../../node_modules/bulma-scss/elements/content";
|
||||
@import "ckeditor";
|
||||
@import "highlightjs";
|
||||
@import "ckeditor/all";
|
||||
@import "c3";
|
||||
@import "tippy";
|
||||
@import "jqueryui";
|
||||
|
||||
148
css/backoffice/vendors/_ckeditor.scss
vendored
148
css/backoffice/vendors/_ckeditor.scss
vendored
@@ -1,148 +0,0 @@
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
/* SCSS variables */
|
||||
$ibo-vendors-highlightjs--padding: 0.9rem !default;
|
||||
$ibo-vendors-highlightjs--border-radius: $ibo-border-radius-300 !default;
|
||||
|
||||
$ibo-vendors-ckeditor--autocomplete-panel--border: none !default;
|
||||
$ibo-vendors-ckeditor--autocomplete-panel--border-radius: $ibo-border-radius-300 !default;
|
||||
$ibo-vendors-ckeditor--autocomplete-panel--background-color: $ibo-color-white-100 !default;
|
||||
|
||||
$ibo-vendors-ckeditor--autocomplete-item-image--size: 25px !default;
|
||||
$ibo-vendors-ckeditor--autocomplete-item-image--margin-right: 0.5rem !default;
|
||||
$ibo-vendors-ckeditor--autocomplete-item-image--background-color: $ibo-color-blue-100 !default;
|
||||
$ibo-vendors-ckeditor--autocomplete-item-image--border: 1px solid $ibo-color-grey-600 !default;
|
||||
|
||||
$ibo-vendors-ckeditor--autocomplete-item-title--text-color: #3A3A3A !default;
|
||||
|
||||
/* - Following SCSS variables are only there to overlaod the CSS3 variables of CKEditor (see `src/resources/styles/default-theme.css` in CKEditor) */
|
||||
$ibo-vendors-ckeditor--ck-color-list-button-on-background: $ibo-color-grey-200;
|
||||
$ibo-vendors-ckeditor--ck-color-list-button-on-background-focus: $ibo-color-grey-200;
|
||||
$ibo-vendors-ckeditor--ck-color-list-button-hover-background: $ibo-color-grey-200;
|
||||
$ibo-vendors-ckeditor--ck-color-list-button-on-text: $ibo-color-grey-900;
|
||||
$ibo-vendors-ckeditor--ck-text-tiny-font-size: $ibo-font-size-20;
|
||||
$ibo-vendors-ckeditor--ck-text-small-font-size: $ibo-font-size-50;
|
||||
$ibo-vendors-ckeditor--ck-text-big-font-size: $ibo-font-size-200;
|
||||
$ibo-vendors-ckeditor--ck-text-huge-font-size: $ibo-font-size-350;
|
||||
|
||||
/* CSS3 variables */
|
||||
.ck {
|
||||
--ck-color-list-button-on-background: #{$ibo-vendors-ckeditor--ck-color-list-button-on-background};
|
||||
--ck-color-list-button-on-background-focus: #{$ibo-vendors-ckeditor--ck-color-list-button-on-background-focus};
|
||||
--ck-color-list-button-hover-background: #{$ibo-vendors-ckeditor--ck-color-list-button-hover-background};
|
||||
--ck-color-list-button-on-text: #{$ibo-vendors-ckeditor--ck-color-list-button-on-text};
|
||||
--ck-text-tiny-font-size: #{$ibo-vendors-ckeditor--ck-text-tiny-font-size};
|
||||
--ck-text-small-font-size: #{$ibo-vendors-ckeditor--ck-text-small-font-size};
|
||||
--ck-text-big-font-size: #{$ibo-vendors-ckeditor--ck-text-big-font-size};
|
||||
--ck-text-huge-font-size: #{$ibo-vendors-ckeditor--ck-text-huge-font-size};
|
||||
}
|
||||
|
||||
/* Base style */
|
||||
.ck-editor {
|
||||
width: 100% !important; /* Force editor to always take its container full width (not less, not more) */
|
||||
display: inline-grid; /* Force editor to always take its container full width (not less, not more) */
|
||||
|
||||
.ck-editor__main {
|
||||
overflow: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.ck-editor__editable_inline:not(.ck-comment__input *) {
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
/* Fullscreen button (Combodo custom plugin) */
|
||||
.ck.ck-editor.cke-maximized {
|
||||
position: fixed;
|
||||
left: 0px;
|
||||
top:0px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 999;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.ck-editor__main{
|
||||
flex-grow: 1;
|
||||
}
|
||||
.ck-editor__editable_inline:not(.ck-comment__input *){
|
||||
height: 100% !important; /* !important to overload inline style from configuration.height */
|
||||
width: 100% !important; /* !important to overload inline style from configuration.width */
|
||||
}
|
||||
}
|
||||
|
||||
/* Highlight JS */
|
||||
.hljs {
|
||||
padding: $ibo-vendors-highlightjs--padding !important;
|
||||
box-shadow: 0 0px 3px 2px inset rgba(0, 0, 0, 0.4);
|
||||
border-radius: $ibo-vendors-highlightjs--border-radius;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.ibo-hljs-container{
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
/* Mentions */
|
||||
.ibo-mention-item{
|
||||
line-height: 1.6rem;
|
||||
}
|
||||
|
||||
[data-role="object-mention"]{
|
||||
color: #0782C1;
|
||||
}
|
||||
[data-role="object-mention"]:hover{
|
||||
color: #2b6bb0;
|
||||
}
|
||||
|
||||
/* Mentions in caselogs */
|
||||
/* Note: Mind the "ul", it allows us to have a more precise rule than the original plugin's CSS so we can override it */
|
||||
ul.cke_autocomplete_panel{
|
||||
background-color: $ibo-vendors-ckeditor--autocomplete-panel--background-color;
|
||||
border: $ibo-vendors-ckeditor--autocomplete-panel--border;
|
||||
border-radius: $ibo-vendors-ckeditor--autocomplete-panel--border-radius;
|
||||
@extend %ibo-elevation-300;
|
||||
|
||||
.ibo-vendors-ckeditor--autocomplete-item{
|
||||
display: flex;
|
||||
justify-content: left;
|
||||
align-items: center;
|
||||
}
|
||||
.ibo-vendors-ckeditor--autocomplete-item-image{
|
||||
width: $ibo-vendors-ckeditor--autocomplete-item-image--size;
|
||||
height: $ibo-vendors-ckeditor--autocomplete-item-image--size;
|
||||
/* min-xxx are here to avoid medallion to be horizontally compressed when the title is to long */
|
||||
min-width: $ibo-vendors-ckeditor--autocomplete-item-image--size;
|
||||
min-height: $ibo-vendors-ckeditor--autocomplete-item-image--size;
|
||||
background-position: center center;
|
||||
background-size: 100%;
|
||||
border-radius: 100%;
|
||||
margin-right: $ibo-vendors-ckeditor--autocomplete-item-image--margin-right;
|
||||
background-color: $ibo-vendors-ckeditor--autocomplete-item-image--background-color;
|
||||
border: $ibo-vendors-ckeditor--autocomplete-item-image--border;
|
||||
|
||||
@extend %ibo-fully-centered-content;
|
||||
}
|
||||
.ibo-vendors-ckeditor--autocomplete-item-title{
|
||||
white-space: nowrap; /* Here we don't want to truncate the text as in an autocomplete we might have similar values and we need the user to see the entire text to be able to differenciate them */
|
||||
color: $ibo-vendors-ckeditor--autocomplete-item-title--text-color;
|
||||
@extend %ibo-font-weight-700;
|
||||
}
|
||||
}
|
||||
|
||||
.ibo-vendors-ckeditor--display-content{
|
||||
.cke_editable{
|
||||
line-height: 1.4;
|
||||
}
|
||||
figure{
|
||||
border: solid 1px #ccc;
|
||||
border-radius: 2px;
|
||||
}
|
||||
p{
|
||||
margin-top: 0.25em;
|
||||
margin-bottom: 0.25em;
|
||||
}
|
||||
}
|
||||
116
css/backoffice/vendors/_highlightjs.scss
vendored
Normal file
116
css/backoffice/vendors/_highlightjs.scss
vendored
Normal file
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
// Backoffice specific variables
|
||||
$ibo-vendors-highlightjs--padding: $common-vendors-highlightjs--padding !default;
|
||||
$ibo-vendors-highlightjs--box-shadow: $common-vendors-highlightjs--box-shadow !default;
|
||||
$ibo-vendors-highlightjs--border-radius: $common-vendors-highlightjs--border-radius !default;
|
||||
$ibo-vendors-highlightjs--code--padding-x: $common-vendors-highlightjs--code--padding-x !default;
|
||||
$ibo-vendors-highlightjs--code--padding-y: $common-vendors-highlightjs--code--padding-y !default;
|
||||
|
||||
$ibo-vendors-highlightjs--background-color: $common-vendors-highlightjs--background-color !default;
|
||||
$ibo-vendors-highlightjs--color: $common-vendors-highlightjs--color !default;
|
||||
$ibo-vendors-highlightjs--keyword--color: $common-vendors-highlightjs--keyword--color !default;
|
||||
$ibo-vendors-highlightjs--number--color: $common-vendors-highlightjs--number--color !default;
|
||||
$ibo-vendors-highlightjs--attribute--color: $common-vendors-highlightjs--attribute--color !default;
|
||||
$ibo-vendors-highlightjs--regexp--color: $common-vendors-highlightjs--regexp--color !default;
|
||||
$ibo-vendors-highlightjs--meta--color: $common-vendors-highlightjs--meta--color !default;
|
||||
$ibo-vendors-highlightjs--tag--color: $common-vendors-highlightjs--tag--color !default;
|
||||
$ibo-vendors-highlightjs--string--color: $common-vendors-highlightjs--string--color !default;
|
||||
$ibo-vendors-highlightjs--comment--color: $common-vendors-highlightjs--comment--color !default;
|
||||
$ibo-vendors-highlightjs--selector-class--color: $common-vendors-highlightjs--selector-class--color !default;
|
||||
$ibo-vendors-highlightjs--code--color: $common-vendors-highlightjs--code--color !default;
|
||||
|
||||
// Highlight.js stylesheets
|
||||
/* Highlight JS */
|
||||
.common-hljs-container{
|
||||
padding: 0 !important;
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
pre code.hljs {
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
padding: $ibo-vendors-highlightjs--padding !important;
|
||||
}
|
||||
|
||||
code.hljs {
|
||||
padding: $ibo-vendors-highlightjs--code--padding-y $ibo-vendors-highlightjs--code--padding-x !important;
|
||||
}
|
||||
/**
|
||||
* Obsidian style
|
||||
* ported by Alexander Marenin (http://github.com/ioncreature)
|
||||
*/
|
||||
.hljs {
|
||||
box-shadow: $ibo-vendors-highlightjs--box-shadow !important;
|
||||
border-radius: $ibo-vendors-highlightjs--border-radius !important;
|
||||
white-space: pre-wrap;
|
||||
border: none !important;
|
||||
color: $ibo-vendors-highlightjs--color !important;
|
||||
background: $ibo-vendors-highlightjs--background-color !important;
|
||||
}
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-literal,
|
||||
.hljs-selector-id {
|
||||
color: $ibo-vendors-highlightjs--keyword--color !important;
|
||||
}
|
||||
.hljs-number {
|
||||
color: $ibo-vendors-highlightjs--number--color !important;
|
||||
}
|
||||
.hljs-attribute {
|
||||
color: $ibo-vendors-highlightjs--attribute--color
|
||||
}
|
||||
.hljs-regexp,
|
||||
.hljs-link {
|
||||
color: $ibo-vendors-highlightjs--regexp--color !important;
|
||||
}
|
||||
.hljs-meta {
|
||||
color: $ibo-vendors-highlightjs--meta--color !important;
|
||||
}
|
||||
.hljs-tag,
|
||||
.hljs-name,
|
||||
.hljs-bullet,
|
||||
.hljs-subst,
|
||||
.hljs-emphasis,
|
||||
.hljs-type,
|
||||
.hljs-built_in,
|
||||
.hljs-selector-attr,
|
||||
.hljs-selector-pseudo,
|
||||
.hljs-addition,
|
||||
.hljs-variable,
|
||||
.hljs-template-tag,
|
||||
.hljs-template-variable {
|
||||
color: $ibo-vendors-highlightjs--tag--color !important;
|
||||
}
|
||||
.hljs-string,
|
||||
.hljs-symbol {
|
||||
color: $ibo-vendors-highlightjs--string--color !important;
|
||||
}
|
||||
.hljs-comment,
|
||||
.hljs-quote,
|
||||
.hljs-deletion {
|
||||
color: $ibo-vendors-highlightjs--comment--color !important;
|
||||
}
|
||||
.hljs-selector-class {
|
||||
color: $ibo-vendors-highlightjs--selector-class--color !important;
|
||||
}
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-literal,
|
||||
.hljs-doctag,
|
||||
.hljs-title,
|
||||
.hljs-section,
|
||||
.hljs-type,
|
||||
.hljs-name,
|
||||
.hljs-strong {
|
||||
font-weight: bold
|
||||
}
|
||||
.hljs-code,
|
||||
.hljs-title.class_,
|
||||
.hljs-class .hljs-title,
|
||||
.hljs-section {
|
||||
color: $ibo-vendors-highlightjs--code--color !important;
|
||||
}
|
||||
24
css/backoffice/vendors/_selectize.scss
vendored
24
css/backoffice/vendors/_selectize.scss
vendored
@@ -23,6 +23,17 @@ $ibo-vendors-selectize--item--ignore-partial--background-color: $ibo-color-grey-
|
||||
|
||||
$ibo-vendors-selectize--input-error--border: 1px solid $ibo-color-red-600 !default;
|
||||
|
||||
$ibo-vendors-selectize--input--border-color: $ibo-color-grey-500 !default;
|
||||
|
||||
$ibo-vendors-selectize--element--active--background: $ibo-color-blue-100 !default;
|
||||
$ibo-vendors-selectize--element--active--color: $ibo-color-grey-900 !default;
|
||||
|
||||
$ibo-vendors-selectize--dropdown--background-color: $ibo-vendors-selectize-input--background-color !default;
|
||||
$ibo-vendors-selectize--dropdown--color: $ibo-vendors-selectize-input--color!default;
|
||||
|
||||
$ibo-vendors-selectize--header--padding-x: 8px !default;
|
||||
$ibo-vendors-selectize--header--padding-y: 5px !default;
|
||||
|
||||
.selectize-control.single .selectize-input {
|
||||
box-shadow: unset;
|
||||
background-color: $ibo-vendors-selectize-input--background-color;
|
||||
@@ -43,7 +54,8 @@ $ibo-vendors-selectize--input-error--border: 1px solid $ibo-color-red-600 !defau
|
||||
border-width: unset;
|
||||
border-color: unset;
|
||||
}
|
||||
.selectize-control.single .selectize-input:after {
|
||||
.selectize-control.single .selectize-input:after,
|
||||
.selectize-control.single .selectize-input:not(.no-arrow):after {
|
||||
content: unset;
|
||||
}
|
||||
.selectize-input::after {
|
||||
@@ -55,20 +67,22 @@ $ibo-vendors-selectize--input-error--border: 1px solid $ibo-color-red-600 !defau
|
||||
}
|
||||
|
||||
.selectize-control.single .selectize-input, .selectize-dropdown.single {
|
||||
border-color: $ibo-color-grey-500;
|
||||
border-color: $ibo-vendors-selectize--input--border-color;
|
||||
}
|
||||
|
||||
.selectize-dropdown {
|
||||
background-color: $ibo-vendors-selectize--dropdown--background-color;
|
||||
color: $ibo-vendors-selectize--dropdown--color;
|
||||
.selected,
|
||||
.active,
|
||||
.active:not(.selected){
|
||||
background: #f5fafd;
|
||||
color: #495c68;
|
||||
background: $ibo-vendors-selectize--element--active--background;
|
||||
color: $ibo-vendors-selectize--element--active--color;
|
||||
}
|
||||
|
||||
[data-selectable],
|
||||
.optgroup-header {
|
||||
padding: 5px 8px;
|
||||
padding: $ibo-vendors-selectize--header--padding-y $ibo-vendors-selectize--header--padding-x;
|
||||
}
|
||||
|
||||
.option {
|
||||
|
||||
7
css/backoffice/vendors/ckeditor/_all.scss
vendored
Normal file
7
css/backoffice/vendors/ckeditor/_all.scss
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
/*!
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
@import "../../../../node_modules/ckeditor5-itop-build/build/styles/compiled-theme"; /* CKEditor content styles (tables, lists, ...) */
|
||||
@import "overloads"; /* Overloads of CKEditor styles for the backoffice */
|
||||
88
css/backoffice/vendors/ckeditor/_overloads.scss
vendored
Normal file
88
css/backoffice/vendors/ckeditor/_overloads.scss
vendored
Normal file
@@ -0,0 +1,88 @@
|
||||
/*!
|
||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
/* SCSS variables */
|
||||
$ibo-vendors-ckeditor--ck-content--text-color: $ibo-color-grey-900 !default;
|
||||
$ibo-vendors-ckeditor--ck-content-pre-language--padding: 0 !default;
|
||||
$ibo-vendors-ckeditor--ck-content-pre-language--code--background-color: $ibo-color-grey-900 !default;
|
||||
$ibo-vendors-ckeditor--ck-content-pre-language--code--color: $ibo-color-white-100 !default;
|
||||
$ibo-vendors-ckeditor--ck-content-pre-language--code--padding: $ibo-vendors-highlightjs--padding !default;
|
||||
|
||||
/* - Following SCSS variables are only there to overlaod the CSS3 variables of CKEditor (see `src/resources/styles/default-theme.css` in CKEditor) */
|
||||
$ibo-vendors-ckeditor--ck-color-list-button-on-background: $ibo-color-grey-200 !default;
|
||||
$ibo-vendors-ckeditor--ck-color-list-button-on-background-focus: $ibo-color-grey-200 !default;
|
||||
$ibo-vendors-ckeditor--ck-color-list-button-hover-background: $ibo-color-grey-200 !default;
|
||||
$ibo-vendors-ckeditor--ck-color-list-button-on-text: $ibo-color-grey-900 !default;
|
||||
|
||||
$ibo-vendors-ckeditor--ck-text-tiny-font-size: $ibo-font-size-20 !default;
|
||||
$ibo-vendors-ckeditor--ck-text-small-font-size: $ibo-font-size-50 !default;
|
||||
$ibo-vendors-ckeditor--ck-text-big-font-size: $ibo-font-size-200 !default;
|
||||
$ibo-vendors-ckeditor--ck-text-huge-font-size: $ibo-font-size-350 !default;
|
||||
|
||||
$ibo-vendors-ckeditor--ck-color-image-caption-text: $ibo-color-grey-900 !default;
|
||||
|
||||
$ibo-vendors-ckeditor--ck-mentions--item--line-height: 1.6rem !default;
|
||||
$ibo-vendors-ckeditor--ck-mentions--item--padding-x: $ibo-spacing-300 !default;
|
||||
$ibo-vendors-ckeditor--ck-mentions--item--padding-y: $ibo-spacing-200 !default;
|
||||
|
||||
/* CSS3 variables */
|
||||
.ck {
|
||||
--ck-color-list-button-on-background: #{$ibo-vendors-ckeditor--ck-color-list-button-on-background};
|
||||
--ck-color-list-button-on-background-focus: #{$ibo-vendors-ckeditor--ck-color-list-button-on-background-focus};
|
||||
--ck-color-list-button-hover-background: #{$ibo-vendors-ckeditor--ck-color-list-button-hover-background};
|
||||
--ck-color-list-button-on-text: #{$ibo-vendors-ckeditor--ck-color-list-button-on-text};
|
||||
|
||||
--ck-text-tiny-font-size: #{$ibo-vendors-ckeditor--ck-text-tiny-font-size};
|
||||
--ck-text-small-font-size: #{$ibo-vendors-ckeditor--ck-text-small-font-size};
|
||||
--ck-text-big-font-size: #{$ibo-vendors-ckeditor--ck-text-big-font-size};
|
||||
--ck-text-huge-font-size: #{$ibo-vendors-ckeditor--ck-text-huge-font-size};
|
||||
|
||||
--ck-color-image-caption-text: #{$ibo-vendors-ckeditor--ck-color-image-caption-text};
|
||||
}
|
||||
|
||||
/* Base style */
|
||||
.ck-editor {
|
||||
width: 100% !important; /* Force editor to always take its container full width (not less, not more) */
|
||||
display: inline-grid; /* Force editor to always take its container full width (not less, not more) */
|
||||
|
||||
.ck-editor__main {
|
||||
overflow: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.ck.ck-content {
|
||||
color: $ibo-vendors-ckeditor--ck-content--text-color;
|
||||
/* Needed to let table grow inside their resizer as `.ibo-is-html-content table` rule unset ckeditor default 100% width */
|
||||
.table table {
|
||||
width: 100% !important;
|
||||
}
|
||||
}
|
||||
|
||||
.ck-editor__editable_inline:not(.ck-comment__input *) {
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
.ck-content pre[data-language] {
|
||||
padding: $ibo-vendors-ckeditor--ck-content-pre-language--padding !important;
|
||||
code {
|
||||
display: block;
|
||||
background: $ibo-vendors-ckeditor--ck-content-pre-language--code--background-color !important;
|
||||
padding: $ibo-vendors-ckeditor--ck-content-pre-language--code--padding !important;
|
||||
color: $ibo-vendors-ckeditor--ck-content-pre-language--code--color !important;
|
||||
}
|
||||
}
|
||||
|
||||
// N°7552 Allow source editing area to be scrollable in full screen
|
||||
.ck-maximize_editor_main .ck-source-editing-area textarea{
|
||||
overflow: auto !important;
|
||||
}
|
||||
|
||||
/* Mentions */
|
||||
.ck-mentions {
|
||||
.ck-button {
|
||||
line-height: $ibo-vendors-ckeditor--ck-mentions--item--line-height;
|
||||
padding: $ibo-vendors-ckeditor--ck-mentions--item--padding-y $ibo-vendors-ckeditor--ck-mentions--item--padding-x !important; /* Important in order to overload the CKE native rule */
|
||||
}
|
||||
}
|
||||
5
css/c3.min.css
vendored
5
css/c3.min.css
vendored
@@ -1,5 +0,0 @@
|
||||
/*
|
||||
* @deprecated 3.2.0 N°5621 Moved to NPM
|
||||
*/
|
||||
|
||||
.c3 svg{font:10px sans-serif;-webkit-tap-highlight-color:transparent}.c3 line,.c3 path{fill:none;stroke:#000}.c3 text{-webkit-user-select:none;-moz-user-select:none;user-select:none}.c3-bars path,.c3-event-rect,.c3-legend-item-tile,.c3-xgrid-focus,.c3-ygrid{shape-rendering:crispEdges}.c3-chart-arc path{stroke:#fff}.c3-chart-arc text{fill:#fff;font-size:13px}.c3-grid line{stroke:#aaa}.c3-grid text{fill:#aaa}.c3-xgrid,.c3-ygrid{stroke-dasharray:3 3}.c3-text.c3-empty{fill:gray;font-size:2em}.c3-line{stroke-width:1px}.c3-circle._expanded_{stroke-width:1px;stroke:#fff}.c3-selected-circle{fill:#fff;stroke-width:2px}.c3-bar{stroke-width:0}.c3-bar._expanded_{fill-opacity:.75}.c3-target.c3-focused{opacity:1}.c3-target.c3-focused path.c3-line,.c3-target.c3-focused path.c3-step{stroke-width:2px}.c3-target.c3-defocused{opacity:.3!important}.c3-region{fill:#4682b4;fill-opacity:.1}.c3-brush .extent{fill-opacity:.1}.c3-legend-item{font-size:12px}.c3-legend-item-hidden{opacity:.15}.c3-legend-background{opacity:.75;fill:#fff;stroke:#d3d3d3;stroke-width:1}.c3-title{font:14px sans-serif}.c3-tooltip-container{z-index:10}.c3-tooltip{border-collapse:collapse;border-spacing:0;background-color:#fff;empty-cells:show;-webkit-box-shadow:7px 7px 12px -9px #777;-moz-box-shadow:7px 7px 12px -9px #777;box-shadow:7px 7px 12px -9px #777;opacity:.9}.c3-tooltip tr{border:1px solid #CCC}.c3-tooltip th{background-color:#aaa;font-size:14px;padding:2px 5px;text-align:left;color:#FFF}.c3-tooltip td{font-size:13px;padding:3px 6px;background-color:#fff;border-left:1px dotted #999}.c3-tooltip td>span{display:inline-block;width:10px;height:10px;margin-right:6px}.c3-tooltip td.value{text-align:right}.c3-area{stroke-width:0;opacity:.2}.c3-chart-arcs-title{dominant-baseline:middle;font-size:1.3em}.c3-chart-arcs .c3-chart-arcs-background{fill:#e0e0e0;stroke:none}.c3-chart-arcs .c3-chart-arcs-gauge-unit{fill:#000;font-size:16px}.c3-chart-arcs .c3-chart-arcs-gauge-max,.c3-chart-arcs .c3-chart-arcs-gauge-min{fill:#777}.c3-chart-arc .c3-gauge-value{fill:#000}
|
||||
108
css/common/README.md
Normal file
108
css/common/README.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# Description
|
||||
This is a brief description of how the common theme is structured using both BEM and SASS 7-1 systems and how to use them.
|
||||
* [7-1 pattern](#7-1-pattern)
|
||||
* [File structure](#file-structure)
|
||||
* [Usage](#usage)
|
||||
* [BEM methodology](#bem-methodology)
|
||||
* [Principles](#principles)
|
||||
* [Examples](#examples)
|
||||
|
||||
# 7-1 pattern
|
||||
## File structure
|
||||
SCSS files are structured following the [7-1 pattern](https://sass-guidelin.es/#the-7-1-pattern). \
|
||||
@rveitch made a great summary with the following, which can also be found [here](https://gist.github.com/rveitch/84cea9650092119527bc).
|
||||
|
||||
_Note: Folders with an * are customizations we made to the original 7-1 pattern to best fit our needs_
|
||||
|
||||
```
|
||||
css/common/
|
||||
|
|
||||
|– utils/
|
||||
| |– variables/ # Sass Variables used in Functions, Mixins, Helpers, ...
|
||||
| | |- colors/
|
||||
| | | |- _base.scss
|
||||
| | | |- _base-palette.scss # Base colors used everywhere
|
||||
| | | |- _lifecycle-palette.scss # Colors used for lifecycle of an object (e.g. representing states such as new, frozen, done, ...), based on the base colors
|
||||
| | | |- _semantic-palette.scss # Colors used for semantic meaning (e.g. red for errors, green for success, ...), based on the base colors
|
||||
| | | ...
|
||||
| | |
|
||||
| | |- _depression.scss
|
||||
| | |- _elevation.scss
|
||||
| | |- _size.scss # Base sizes used everywhere (spacings, ...)
|
||||
| | |- _spacing.scss
|
||||
| | |- _typography.scss # Typography sizes, weights, families, ...
|
||||
| | ...
|
||||
| |
|
||||
| |– functions/ # Sass Functions
|
||||
| | |- _color.scss # Color manipulation functions
|
||||
| |
|
||||
| |– mixins/ # Sass Mixins
|
||||
| |– helpers/ # Class & placeholders helpers
|
||||
|
|
||||
|– vendors/ # Third-party libs, should be either:
|
||||
| # - Overload of the lib SCSS variables (BEST way, but possible only if the lib exposes them. e.g. Bulma)
|
||||
| # - Overload of the lib necessary CSS classes only (not great as it duplicates some rules in the browser, which add weight and computation. e.g. dataTables)
|
||||
| # - Duplicate the lib CSS completly to insert SCSS variables (not great as it will be outdated when updating the lib itself. e.g. jQuery UI)
|
||||
| |– _bulma-variables-overload.scss # Bulma CSS framework
|
||||
| |– _jquery-ui.scss # jQuery UI
|
||||
| ... # Etc…
|
||||
|
|
||||
|– base/
|
||||
| |– _reset.scss # Reset/normalize
|
||||
| |– _typography.scss # Typography fonts imports
|
||||
| ... # Etc…
|
||||
|
|
||||
|- _shame.scss # Shame file, should contain all the ugly hacks (https://sass-guidelin.es/#shame-file)
|
||||
`– main.scss # Main Sass file
|
||||
```
|
||||
|
||||
## Usage
|
||||
To avoid common errors, files should be imported in the final file in the following order. Again those are just following the SASS guidelines:
|
||||
- Utils
|
||||
- Variables
|
||||
- Functions
|
||||
- Mixins
|
||||
- Helpers
|
||||
- Vendors
|
||||
- Base
|
||||
- Shame file
|
||||
|
||||
# BEM methodology
|
||||
## Principles
|
||||
[BEM is a methodology](https://getbem.com/) that helps you to create reusable components and code sharing in front‑end development. \
|
||||
The main idea is to use discriminant classes instead of nested basic selectors for 2 main reasons:
|
||||
* It's easier to understand the purpose of a specific class when seeing it in the HTML markup of the SCSS file
|
||||
* It's easier to override a specific class when needed as you don't need to use a selector at least as precise/complex as the one you want to override
|
||||
|
||||
In our implementation, we start with the code of the UI block, followed by the sub-element, then the property or modifier. Separation is made of `--` instead of `__`.
|
||||
|
||||
## Examples
|
||||
### Classes and CSS properties example
|
||||
```scss
|
||||
// SCSS variables:
|
||||
// - For CSS properties: CSS class, followed by CSS property
|
||||
$common-button--padding-y: 6px !default;
|
||||
$common-button--padding-x: 9px !default;
|
||||
$common-button--border: 0 !default;
|
||||
$common-button--border-radius: $common-border-radius-400 !default;
|
||||
$common-button--box-shadow-bottom: 0px 2px 0px !default;
|
||||
$common-button--box-shadow-top: inset 0px 2px 0px !default;
|
||||
|
||||
$common-button--label--margin-left: $common-spacing-200 !default;
|
||||
|
||||
```
|
||||
|
||||
### States example
|
||||
```scss
|
||||
// SCSS variables:
|
||||
// Same rule as before, but with a `--is-` or `--on--` suffix
|
||||
$common-quick-create--input--padding: $common-spacing-0 default;
|
||||
$common-quick-create--input--padding-x--is-opened: $common-spacing-300 !default;
|
||||
$common-quick-create--input--padding-y--is-opened: $common-spacing-300 !default;
|
||||
|
||||
$common-quick-create--input--width: $common-size-0 !default;
|
||||
$common-quick-create--input--width--is-opened: 245px !default;
|
||||
|
||||
$common-quick-create--input--background-color: $common-color-white-100 !default;
|
||||
$common-quick-create--input--background-color--on-hover: $common-color-grey-200 !default;
|
||||
```
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user