mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-28 06:34:14 +01:00
Compare commits
524 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ada74e63f | ||
|
|
0ccb452ab7 | ||
|
|
600a6185a3 | ||
|
|
354a7cabab | ||
|
|
0802e5abb5 | ||
|
|
8ade0a6e85 | ||
|
|
0dae7346d1 | ||
|
|
cdfded766f | ||
|
|
bfc583e6b5 | ||
|
|
5bc453bca6 | ||
|
|
5dd450e9bf | ||
|
|
82395727bf | ||
|
|
318b792b31 | ||
|
|
0fe2183369 | ||
|
|
8f038d2f95 | ||
|
|
fbf3dd8cf7 | ||
|
|
01c9e73020 | ||
|
|
0736045b90 | ||
|
|
86776edfb3 | ||
|
|
d78805d8ae | ||
|
|
03e1d46586 | ||
|
|
f3deb8be11 | ||
|
|
981d5c6263 | ||
|
|
e000befc0f | ||
|
|
2eba58998b | ||
|
|
4ed21dc21a | ||
|
|
fa5cad0fdb | ||
|
|
5d28de1636 | ||
|
|
6be9255ca0 | ||
|
|
1f4a2f0f56 | ||
|
|
edbe4974ac | ||
|
|
7e515e7216 | ||
|
|
bf7a756714 | ||
|
|
428d2c6356 | ||
|
|
d589d9d05a | ||
|
|
c0c9ea9287 | ||
|
|
fae2bcc6e9 | ||
|
|
53047d35fe | ||
|
|
8982f7e0e3 | ||
|
|
909469ce97 | ||
|
|
dacb54285c | ||
|
|
5af93ca92a | ||
|
|
3fa500c9c1 | ||
|
|
f0adbbba29 | ||
|
|
bbdb30f421 | ||
|
|
897b5d452e | ||
|
|
fdd1479c8e | ||
|
|
7851109794 | ||
|
|
810e6c1bda | ||
|
|
d164f48cfe | ||
|
|
506def4340 | ||
|
|
08b8e919b7 | ||
|
|
696e2c9565 | ||
|
|
d728be119c | ||
|
|
463869b89d | ||
|
|
1d4c0b8e7f | ||
|
|
bf1b2a5104 | ||
|
|
15103dc49f | ||
|
|
bb8a09d8e2 | ||
|
|
901f8f2a7b | ||
|
|
ba6fff801b | ||
|
|
50098bad73 | ||
|
|
2ee68ff819 | ||
|
|
44972f34e5 | ||
|
|
65c9145b10 | ||
|
|
a104310379 | ||
|
|
f5cce23bb4 | ||
|
|
0f39106b56 | ||
|
|
ee993ef80a | ||
|
|
0a4180f7fc | ||
|
|
b56113aada | ||
|
|
c82c150411 | ||
|
|
00818f411f | ||
|
|
a6a459967e | ||
|
|
2ba4109343 | ||
|
|
738664e560 | ||
|
|
d48bc15211 | ||
|
|
32f0cfb091 | ||
|
|
20393b55b9 | ||
|
|
437296eab9 | ||
|
|
f03b008ebf | ||
|
|
7f98ef3478 | ||
|
|
d80e26791d | ||
|
|
e6a0d95cba | ||
|
|
965c9dba14 | ||
|
|
8bca3ac830 | ||
|
|
a975f67bd5 | ||
|
|
f5b86ff4d9 | ||
|
|
0deeeeb587 | ||
|
|
2011570b84 | ||
|
|
1458ba877b | ||
|
|
71386198cf | ||
|
|
5b9e0a1d4f | ||
|
|
1667f834b9 | ||
|
|
7cf6f65265 | ||
|
|
cdbcd14767 | ||
|
|
603340b852 | ||
|
|
820087e4d1 | ||
|
|
c5ee123f88 | ||
|
|
69d5015a24 | ||
|
|
1d1365d951 | ||
|
|
3da33c4c64 | ||
|
|
491f55c7bd | ||
|
|
7b95d65f60 | ||
|
|
d3e450c54e | ||
|
|
5a50398dba | ||
|
|
387ca19ec2 | ||
|
|
c0651edaa1 | ||
|
|
b06f3cd13e | ||
|
|
5aeb408edd | ||
|
|
7456383d72 | ||
|
|
9c6b8f90f0 | ||
|
|
e6ea2fd541 | ||
|
|
7d94e6f1f8 | ||
|
|
2bd7c7a01a | ||
|
|
f1762845f0 | ||
|
|
3eb8437c32 | ||
|
|
9acc6a8bd4 | ||
|
|
4d794fe656 | ||
|
|
c9f88a16ef | ||
|
|
95f84a98cc | ||
|
|
6cb10ab13a | ||
|
|
048aaeb854 | ||
|
|
2b18ab9690 | ||
|
|
36dc71fdce | ||
|
|
db2ad86c70 | ||
|
|
56616ab08e | ||
|
|
f339498497 | ||
|
|
b24a359b36 | ||
|
|
78c63f7502 | ||
|
|
2f8b35c153 | ||
|
|
271a1f66c1 | ||
|
|
738c7e1b8e | ||
|
|
54278f8c02 | ||
|
|
00e117b05f | ||
|
|
504261a2c2 | ||
|
|
14a1a4e9c7 | ||
|
|
cfc4a43d0b | ||
|
|
503a5ec25a | ||
|
|
09364ccf84 | ||
|
|
4bbd1fea5c | ||
|
|
3c27847a04 | ||
|
|
8523da3329 | ||
|
|
8580cb70a4 | ||
|
|
bfbc939bac | ||
|
|
dffce3f2f7 | ||
|
|
e96095e02d | ||
|
|
8330582f86 | ||
|
|
5a4ad7b8c3 | ||
|
|
a116967b0a | ||
|
|
a13f353721 | ||
|
|
bd254e56d1 | ||
|
|
346bd5de47 | ||
|
|
599e08f150 | ||
|
|
0462298cd3 | ||
|
|
80abaec9a6 | ||
|
|
a7877dc6a6 | ||
|
|
a2d6423f32 | ||
|
|
57d610fc16 | ||
|
|
d2d422afcf | ||
|
|
278ac66637 | ||
|
|
87db141c3c | ||
|
|
f062f994f0 | ||
|
|
fb81e54ed9 | ||
|
|
916467ea61 | ||
|
|
8a4ad87b06 | ||
|
|
2086052d60 | ||
|
|
0a4f9e95c5 | ||
|
|
282fb13973 | ||
|
|
0b92535fda | ||
|
|
a0f4c62bcc | ||
|
|
cd4e2608ee | ||
|
|
d6c9a6d318 | ||
|
|
ca937b829b | ||
|
|
e0b8ee2143 | ||
|
|
20a7a945fc | ||
|
|
0640c1e9b6 | ||
|
|
cad40ed758 | ||
|
|
11d23ac99b | ||
|
|
1eeb98d2e2 | ||
|
|
92e2d22248 | ||
|
|
5811dc06e3 | ||
|
|
6bd11fb9bf | ||
|
|
624573d088 | ||
|
|
b21a02dcb8 | ||
|
|
3b60e63c97 | ||
|
|
adc8b47945 | ||
|
|
5e6d96019d | ||
|
|
06cc64f6d6 | ||
|
|
a5c14c3a48 | ||
|
|
8f6f243716 | ||
|
|
3c574819b2 | ||
|
|
5b1ea20407 | ||
|
|
4d88ef6ed4 | ||
|
|
5cb1102e6e | ||
|
|
bf23e4d98d | ||
|
|
8645b28baa | ||
|
|
eff6fcff49 | ||
|
|
994b08f94a | ||
|
|
19495d8acf | ||
|
|
48a3ea1945 | ||
|
|
a11b2845f7 | ||
|
|
ee72325451 | ||
|
|
ebb59d3ddc | ||
|
|
0193db609d | ||
|
|
ea2caed98a | ||
|
|
09c092782c | ||
|
|
a4166f874e | ||
|
|
96382377ee | ||
|
|
84708fb327 | ||
|
|
02adca0a1f | ||
|
|
90370fce3b | ||
|
|
fe913524fd | ||
|
|
9f2375999a | ||
|
|
4b86639d71 | ||
|
|
911a204f37 | ||
|
|
69f9a0b369 | ||
|
|
25e8ec38d6 | ||
|
|
1574993a28 | ||
|
|
43120bfb60 | ||
|
|
9c1a1d08a1 | ||
|
|
f095f93326 | ||
|
|
c9c3b6c108 | ||
|
|
5caddf81b8 | ||
|
|
73fe07a745 | ||
|
|
1760727879 | ||
|
|
d982652228 | ||
|
|
1d26cac8e3 | ||
|
|
cc47d27fd8 | ||
|
|
1e5334ab2b | ||
|
|
05419f3d7f | ||
|
|
534b087a2c | ||
|
|
e85ec6bb47 | ||
|
|
533fe0ae01 | ||
|
|
efd117eac7 | ||
|
|
01a17b5f9b | ||
|
|
92d49c6c47 | ||
|
|
623d2823ff | ||
|
|
5d5849b724 | ||
|
|
902e2259a9 | ||
|
|
b87fb65ac4 | ||
|
|
ab929571c7 | ||
|
|
8e0e01ad40 | ||
|
|
8a604c643e | ||
|
|
f1594ad974 | ||
|
|
805e208e32 | ||
|
|
9e3f99a150 | ||
|
|
e9d21bca39 | ||
|
|
807283505d | ||
|
|
71244e5c15 | ||
|
|
72e0750c1b | ||
|
|
ac8004561b | ||
|
|
766d3b51ad | ||
|
|
3215bffbcb | ||
|
|
51bb0add8e | ||
|
|
4c8392b332 | ||
|
|
fb180e8370 | ||
|
|
2dd1224219 | ||
|
|
e7b87128b1 | ||
|
|
d0bdde30ad | ||
|
|
3fe8b6c696 | ||
|
|
6539687f16 | ||
|
|
e0b12144cb | ||
|
|
79a46581ef | ||
|
|
5a59d16c99 | ||
|
|
a63a3d3d9c | ||
|
|
ed6e4f612a | ||
|
|
16279233e0 | ||
|
|
07964cc404 | ||
|
|
ea5473ad77 | ||
|
|
2a888cf5af | ||
|
|
548131482a | ||
|
|
5ac6c84813 | ||
|
|
0c3a35fc43 | ||
|
|
881dbd3c01 | ||
|
|
81887f480a | ||
|
|
d25bf4ef66 | ||
|
|
90f58721b1 | ||
|
|
b20b4b7e82 | ||
|
|
eeabad895d | ||
|
|
9fdf183851 | ||
|
|
96414dcc98 | ||
|
|
6ab19d29b9 | ||
|
|
5c5c5d769f | ||
|
|
ecce0a3376 | ||
|
|
f8e761abe0 | ||
|
|
d3a9e30178 | ||
|
|
0fd2cf85a2 | ||
|
|
a64fed66a3 | ||
|
|
261106fa9d | ||
|
|
1556b95653 | ||
|
|
324cb5eb6c | ||
|
|
eedbf3d266 | ||
|
|
3b197692ec | ||
|
|
ecfc26f1ec | ||
|
|
a34baf840a | ||
|
|
6f9bd9bae5 | ||
|
|
c32b2f9dfe | ||
|
|
a1860c82fb | ||
|
|
d47d65df10 | ||
|
|
b42297ad84 | ||
|
|
6cb1cf7b7e | ||
|
|
a65dd1c27c | ||
|
|
d85d611642 | ||
|
|
6a00786535 | ||
|
|
6490fe93a1 | ||
|
|
642a13ad0d | ||
|
|
e1bfe9a3b6 | ||
|
|
af8ff9b29f | ||
|
|
fcfdac2844 | ||
|
|
ce68e270c3 | ||
|
|
0d8a20c35e | ||
|
|
1f3780f338 | ||
|
|
85f6195a51 | ||
|
|
7e1b1779a9 | ||
|
|
d95e7168aa | ||
|
|
a7c22c06af | ||
|
|
a72d1ca1b3 | ||
|
|
be5e4458ba | ||
|
|
317cd585b2 | ||
|
|
5d8db176f4 | ||
|
|
c6039f4b51 | ||
|
|
d0f9e57bf1 | ||
|
|
385c60e993 | ||
|
|
58c68bade9 | ||
|
|
eb992c7b45 | ||
|
|
0688405f86 | ||
|
|
dd34fda42e | ||
|
|
6becd73ac2 | ||
|
|
72d6e251b8 | ||
|
|
9491c9102c | ||
|
|
a728cf312d | ||
|
|
e321e27899 | ||
|
|
96e8467e13 | ||
|
|
508918a684 | ||
|
|
8adef26d18 | ||
|
|
2d45abd12b | ||
|
|
bd5e55aad9 | ||
|
|
b57e4fce07 | ||
|
|
b460705831 | ||
|
|
58c47f4c0a | ||
|
|
f3a6b064c8 | ||
|
|
5e6fb33ed7 | ||
|
|
5e7137e0c4 | ||
|
|
4cf5e47ec3 | ||
|
|
143a59a19d | ||
|
|
61b247b156 | ||
|
|
c1aa013053 | ||
|
|
a3f9eed6e2 | ||
|
|
21c9332a7f | ||
|
|
ae6e0a08ea | ||
|
|
d9d2e851f4 | ||
|
|
91c63cb12e | ||
|
|
4ff354dd41 | ||
|
|
bd8c325306 | ||
|
|
9902cedc06 | ||
|
|
b64ee96636 | ||
|
|
8c1ff2dc1c | ||
|
|
f2ab409c9c | ||
|
|
db46763e13 | ||
|
|
7ee1af3cc8 | ||
|
|
32b371eac1 | ||
|
|
f65cadd24c | ||
|
|
40551b36e5 | ||
|
|
c0056e75d0 | ||
|
|
e5825b5fcd | ||
|
|
d3dc59c5da | ||
|
|
642a097b4b | ||
|
|
1c615c42b6 | ||
|
|
b1f708dcad | ||
|
|
55f202b7cb | ||
|
|
247f1045fe | ||
|
|
42e78ad3a3 | ||
|
|
113826b2e7 | ||
|
|
7fe8da8590 | ||
|
|
821251a53f | ||
|
|
5334bbb303 | ||
|
|
012d5e7ae0 | ||
|
|
03f4e9f621 | ||
|
|
055968bea9 | ||
|
|
d0457b73ec | ||
|
|
7e8ff50886 | ||
|
|
36a6ee4fc9 | ||
|
|
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 |
@@ -1,99 +0,0 @@
|
|||||||
# Phpdoc dokuwiki template
|
|
||||||
This directory contains a template for rendering iTop phpdoc as dokuwiki pages.
|
|
||||||
|
|
||||||
|
|
||||||
Conventional tags that you should use:
|
|
||||||
* `@internal` : exclude from the documentation.
|
|
||||||
* `@api` : it means that a method is an api, thus it may be interacted with.
|
|
||||||
* `@see` : it points to another documented method
|
|
||||||
* `@link` : external url
|
|
||||||
* if you point to another page of the wiki, please use relative links.
|
|
||||||
* `@example` : let you provide example of code
|
|
||||||
* `@param`, `@return`, `@throws`, ...
|
|
||||||
|
|
||||||
|
|
||||||
## Special instructions
|
|
||||||
|
|
||||||
Some iTop specific tags were added :
|
|
||||||
* `@api-advanced`: it means that a method is an `@api` but mark it also as "complex" to use
|
|
||||||
* `@overwritable-hook`: used to mark a method as "designed to be extended"
|
|
||||||
* `@extension-hook`: not used for now
|
|
||||||
* `@phpdoc-tuning-exclude-inherited`: once this tag is present on a class, it's inherited methods won't be showed.
|
|
||||||
|
|
||||||
|
|
||||||
### known limitations:
|
|
||||||
#### `@see` tags must be very specific:
|
|
||||||
* always prefix class members (attributes or methods) with `ClassName::` (do not use self)
|
|
||||||
* for methods always suffix them with `()`,
|
|
||||||
* do not reference variables since they are not documented. If you have to, always prefix them with `$`
|
|
||||||
|
|
||||||
examples:
|
|
||||||
```
|
|
||||||
/**
|
|
||||||
* @see DBObject
|
|
||||||
* @see DBObject::Get()
|
|
||||||
* @see DBObject::$foo
|
|
||||||
*/
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Do not use inline tags, they do not work properly, example:
|
|
||||||
```
|
|
||||||
/**
|
|
||||||
* This is a texts with an inline tag {@see [FQSEN] [<description>]} it must never be used
|
|
||||||
*/
|
|
||||||
```
|
|
||||||
|
|
||||||
#### The `@example` tag must respect this very precise syntax
|
|
||||||
* the sentence in the first line (next to the tag) is the title, it must be enclosed by double quotes
|
|
||||||
* the following lines are the sample code.
|
|
||||||
* 💔 since we simply hack the official tag, this syntax must be respected carefully 💔
|
|
||||||
example:
|
|
||||||
```
|
|
||||||
/**
|
|
||||||
* @example "This is the title of the multiline example"
|
|
||||||
* $foo = DBObject::Get('foo');
|
|
||||||
* DBObject::Set('foo', ++$foo);
|
|
||||||
*/
|
|
||||||
```
|
|
||||||
|
|
||||||
## How content is included into the documentation
|
|
||||||
|
|
||||||
**For a class** those requirements have to be respected:
|
|
||||||
- the file containing the class must be listed in `/phpdoc/files/file[]` of `.doc/phpdoc-objects-manipulation.dist.xml`
|
|
||||||
- the class **must not** have the tag `@internal`
|
|
||||||
- the class **must** have at least one of: `@api`, `@api-advanced`, `@overwritable-hook`, `@extension-hook`
|
|
||||||
|
|
||||||
Then, **for a method** of an eligible class:
|
|
||||||
- **public** methods **must** have at least one of: `@api`, `@api-advanced`, `@overwritable-hook`, `@extension-hook`
|
|
||||||
- **protected** methods **must** have at least one of: `@overwritable-hook`, `@extension-hook`
|
|
||||||
- **private** methods are **always excluded**
|
|
||||||
|
|
||||||
**Class properties** and **constants** are never documented (this is subject to change).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## A note about the rendering engine
|
|
||||||
|
|
||||||
:notebook: as spaces are used to mark code, the templates (`.doc/phpdoc-templates/combodo-wiki/*`) have very few indentation, thus they are awful to read (sorry).
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```
|
|
||||||
cd .doc
|
|
||||||
composer require phpdocumentor/phpdocumentor:~2 --dev
|
|
||||||
```
|
|
||||||
|
|
||||||
## Generation
|
|
||||||
|
|
||||||
1. Switch to this directory : `cd /path/to/itop/.doc`
|
|
||||||
2. `composer install`
|
|
||||||
3. `./bin/build-doc-object-manipulation`
|
|
||||||
3. `./bin/build-doc-extensions`
|
|
||||||
4. Get the generated files from `/path/to/itop/data/phpdocumentor/output`
|
|
||||||
|
|
||||||
## Dokuwiki requirements
|
|
||||||
* the template uses the [wrap plugin](https://www.dokuwiki.org/plugin:wrap).
|
|
||||||
* the generated files have to be placed under an arbitrary directory of `[/path/to/dokuwiki]/data/pages`.
|
|
||||||
* the html has to be activated [config:htmlok](https://www.dokuwiki.org/config:htmlok)
|
|
||||||
* the generated files have to be in lowercase
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/sh -x
|
|
||||||
|
|
||||||
rm -rf /tmp/phpdoc-twig-cache/ && rm -rf data/phpdocumentor/output/extensions/ && rm -rf data/phpdocumentor/temp/extensions/ && ./vendor/bin/phpdoc -c ./phpdoc-extensions.dist.xml -vvv
|
|
||||||
|
|
||||||
# now wee need to lowercase every generated file because dokuwiki can't handle uppercase
|
|
||||||
cd ../data/phpdocumentor/output/extensions/ && for i in $(ls | grep [A-Z]); do mv -i $i $(echo $i | tr 'A-Z' 'a-z'); done
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/bin/sh -x
|
|
||||||
|
|
||||||
rm -rf /tmp/phpdoc-twig-cache/ && rm -rf ../data/phpdocumentor/output/objects-manipulation/ && rm -rf ../data/phpdocumentor/temp/objects-manipulation/ && ./vendor/bin/phpdoc -c ./phpdoc-objects-manipulation.dist.xml -vvv
|
|
||||||
|
|
||||||
|
|
||||||
# now wee need to lowercase every generated file because dokuwiki can't handle uppercase
|
|
||||||
cd ../data/phpdocumentor/output/objects-manipulation/ && for i in $( ls | grep [A-Z] ); do mv -i $i `echo $i | tr 'A-Z' 'a-z'`; done
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"require-dev": {
|
|
||||||
"phpdocumentor/phpdocumentor": "~2",
|
|
||||||
"jms/serializer": "1.7.*"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
3015
.doc/composer.lock
generated
3015
.doc/composer.lock
generated
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 983 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.4 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 3.0 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 4.8 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.5 MiB |
@@ -86,19 +86,24 @@ gitGraph
|
|||||||
commit id: "2024-01-17a" tag: "2.7.10"
|
commit id: "2024-01-17a" tag: "2.7.10"
|
||||||
checkout support/3.0
|
checkout support/3.0
|
||||||
commit id: "2024-01-17b" tag: "3.0.4"
|
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
|
checkout support/3.2
|
||||||
commit id: "2024-06-25" tag: "3.2.0-beta1" type: REVERSE
|
commit id: "2024-06-25" tag: "3.2.0-beta1" type: REVERSE
|
||||||
commit id: "2024-08-07" tag: "3.2.0"
|
commit id: "2024-08-07" tag: "3.2.0"
|
||||||
|
commit id: "2024-09-13" tag: "3.2.0-2"
|
||||||
|
checkout support/3.1
|
||||||
|
commit id: "2024-09-27" tag: "3.1.2"
|
||||||
|
checkout support/2.7
|
||||||
|
commit id: "2024-09-28" tag: "2.7.11"
|
||||||
checkout support/2.7
|
checkout support/2.7
|
||||||
commit id: "2025-02-25" tag: "2.7.12"
|
commit id: "2025-02-25" tag: "2.7.12"
|
||||||
checkout support/3.1
|
checkout support/3.1
|
||||||
commit id: "2025-02-25 " tag: "3.1.3"
|
commit id: "2025-02-25 " tag: "3.1.3"
|
||||||
checkout support/3.2
|
checkout support/3.2
|
||||||
commit id: "2025-02-25 " tag: "3.2.1"
|
commit id: "2025-02-25 " tag: "3.2.1"
|
||||||
|
commit id: "2025-04-08" tag: "3.2.1-1"
|
||||||
|
commit id: "2025-08-19" tag: "3.2.2-1"
|
||||||
|
checkout support/2.7
|
||||||
|
commit id: "2025-10-07" tag: "2.7.13"
|
||||||
```
|
```
|
||||||
|
|
||||||
To learn more, check the [iTop community versions history on the official wiki](https://www.itophub.io/wiki/page?id=latest:release:start).
|
To learn more, check the [iTop community versions history on the official wiki](https://www.itophub.io/wiki/page?id=latest:release:start).
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
<phpdoc>
|
|
||||||
<title><![CDATA[iTop extensions]]></title>
|
|
||||||
|
|
||||||
<parser>
|
|
||||||
<target>../data/phpdocumentor/temp/extensions</target>
|
|
||||||
</parser>
|
|
||||||
|
|
||||||
<transformer>
|
|
||||||
<target>../data/phpdocumentor/output/extensions</target>
|
|
||||||
</transformer>
|
|
||||||
|
|
||||||
<transformations>
|
|
||||||
<template name="phpdoc-templates/combodo-wiki"/>
|
|
||||||
</transformations>
|
|
||||||
|
|
||||||
<files>
|
|
||||||
<file>../application/applicationextension.inc.php</file>
|
|
||||||
</files>
|
|
||||||
</phpdoc>
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
<phpdoc>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
/**
|
|
||||||
The documentation of this file can be found here : https://docs.phpdoc.org/references/configuration.html
|
|
||||||
it has to be completed by the CLI parameters documentation which is more comprehensive: https://docs.phpdoc.org/references/commands/project_run.html#usage
|
|
||||||
|
|
||||||
usage:
|
|
||||||
vendor/bin/phpdoc -c phpdoc-objects-manipulation.dist.xml
|
|
||||||
|
|
||||||
*/
|
|
||||||
-->
|
|
||||||
|
|
||||||
<title><![CDATA[iTop's objects manipulation API]]></title>
|
|
||||||
|
|
||||||
<parser>
|
|
||||||
<default-package-name>iTopORM</default-package-name>
|
|
||||||
<target>../data/phpdocumentor/temp/objects-manipulation</target>
|
|
||||||
<visibility>public,protected</visibility>
|
|
||||||
<markers>
|
|
||||||
<!--<item>TODO</item>-->
|
|
||||||
<!--<item>FIXME</item>-->
|
|
||||||
</markers>
|
|
||||||
<extensions>
|
|
||||||
<extension>php</extension>
|
|
||||||
</extensions>
|
|
||||||
</parser>
|
|
||||||
|
|
||||||
<transformer>
|
|
||||||
<target>../data/phpdocumentor/output/objects-manipulation</target>
|
|
||||||
</transformer>
|
|
||||||
|
|
||||||
<transformations>
|
|
||||||
<template name="phpdoc-templates/combodo-wiki"/>
|
|
||||||
</transformations>
|
|
||||||
|
|
||||||
<!--<logging>-->
|
|
||||||
<!--<level>warn</level>-->
|
|
||||||
<!--<paths>-->
|
|
||||||
<!--<!–<default>data/phpdocumentor/log/objects-manipulation/{DATE}.log</default>–>-->
|
|
||||||
<!--<!–<errors>data/phpdocumentor/log/objects-manipulation/{DATE}.errors.log</errors>–>-->
|
|
||||||
|
|
||||||
<!--<default>{APP_ROOT}/data/log/{DATE}.log</default>-->
|
|
||||||
<!--<errors>{APP_ROOT}/data/log/{DATE}.errors.log</errors>-->
|
|
||||||
<!--</paths>-->
|
|
||||||
<!--</logging>-->
|
|
||||||
|
|
||||||
<files>
|
|
||||||
<file>../core/dbobject.class.php</file>
|
|
||||||
<file>../core/dbobjectsearch.class.php</file>
|
|
||||||
<file>../core/metamodel.class.php</file>
|
|
||||||
<file>../core/dbobjectset.class.php</file>
|
|
||||||
<file>../core/dbsearch.class.php</file>
|
|
||||||
<file>../core/dbunionsearch.class.php</file>
|
|
||||||
</files>
|
|
||||||
|
|
||||||
</phpdoc>
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
{% extends 'layout.txt.twig' %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<wrap button>[[start|🔙 Back]]</wrap>
|
|
||||||
|
|
||||||
{% if node.tags['internal'] is defined %}
|
|
||||||
====== {{ node.name }} ======
|
|
||||||
<WRAP alert>This class is "internal", and thus is not documented!</WRAP>
|
|
||||||
{% elseif node.tags['api'] is not defined and node.tags['api-advanced'] is not defined and node.tags['overwritable-hook'] is not defined and node.tags['extension-hook'] is not defined %}
|
|
||||||
====== {{ node.name }} ======
|
|
||||||
<WRAP alert>This class is neither "api", "api-advanced", "overwritable-hook" or "extension-hook", and thus is not documented!</WRAP>
|
|
||||||
{% else %}
|
|
||||||
|
|
||||||
====== {{ node.name }} ======
|
|
||||||
|
|
||||||
{% if node.deprecated %}<wrap danger>deprecated</wrap>{% endif %}
|
|
||||||
{% if node.abstract %}<wrap warning>abstract</wrap>{% endif %}
|
|
||||||
{% if node.final %}<wrap notice>final</wrap>{% endif %}
|
|
||||||
{% include 'includes/wrap-tags.txt.twig' with {structure:node, wrap: 'safety', wrapTags: ['api', 'api-advanced', 'overwritable-hook', 'extension-hook']} %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% if node.deprecated %}
|
|
||||||
=== **<del>Deprecated</del>**===
|
|
||||||
//{{ node.tags.deprecated[0].description }}//
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
== {{ node.summary|replace({"\n":""})|raw }} ==
|
|
||||||
<html>{{ node.description|markdown|raw }}</html>
|
|
||||||
|
|
||||||
|
|
||||||
{% include 'includes/code-examples.txt.twig' with {structure:node, title_level: '====='} %}
|
|
||||||
|
|
||||||
|
|
||||||
{% set class = node.parent %}
|
|
||||||
{% block hierarchy_element %}
|
|
||||||
|
|
||||||
{% if class and class.name is defined and class.name|trim != '' %}
|
|
||||||
==== parent ====
|
|
||||||
{% set child = class %}
|
|
||||||
{% set class = class.parent %}
|
|
||||||
{{ block('hierarchy_element') }}
|
|
||||||
[[{{ child.name }}|{{ child.name }}]]
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
|
|
||||||
{% for interface in node.interfaces|sort_asc %}
|
|
||||||
{% if loop.first %}
|
|
||||||
==== Implements ====
|
|
||||||
{% endif %}
|
|
||||||
{% if loop.length > 1 %} * {% endif %}{{ interface.fullyQualifiedStructuralElementName ?: interface }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
{% for trait in node.usedTraits|sort_asc %}
|
|
||||||
{% if loop.first %}
|
|
||||||
==== Uses traits ====
|
|
||||||
{% endif %}
|
|
||||||
{% if loop.length > 1 %} * {% endif %}{{ trait.fullyQualifiedStructuralElementName ?: trait }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
{% include 'includes/see-also.txt.twig' with {structure:node, title_level: '==='} %}
|
|
||||||
|
|
||||||
{% include 'includes/tags.txt.twig' with {structure:node, title_level: '=====', blacklist: ['link', 'see', 'abstract', 'example', 'method', 'property', 'property-read', 'property-write', 'package', 'subpackage', 'phpdoc-tuning-exclude-inherited', 'api', 'api-advanced', 'overwritable-hook', 'extension-hook', 'copyright', 'license', 'code-example']} %}
|
|
||||||
|
|
||||||
{% set methods = node.inheritedMethods.merge(node.methods.merge(node.magicMethods)) %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'api'} %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'api-advanced'} %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'overwritable-hook'} %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'extension-hook'} %}
|
|
||||||
|
|
||||||
|
|
||||||
{% include 'includes/code-examples.txt.twig' with {structure:node, title_level: '=====', sub_title_level: '=='} %}
|
|
||||||
|
|
||||||
<WRAP clear />
|
|
||||||
|
|
||||||
{% for method in methods|sort_asc
|
|
||||||
if method.visibility == 'public'
|
|
||||||
and (
|
|
||||||
method.tags['api'] is defined
|
|
||||||
or method.tags['api-advanced'] is defined
|
|
||||||
or method.tags['overwritable-hook'] is defined
|
|
||||||
or method.tags['extension-hook'] is defined
|
|
||||||
)
|
|
||||||
and (
|
|
||||||
node.tags['phpdoc-tuning-exclude-inherited'] is not defined
|
|
||||||
or method.parent.name == node.name
|
|
||||||
)
|
|
||||||
%}
|
|
||||||
{%- if loop.first %}
|
|
||||||
===== Public methods =====
|
|
||||||
{% endif %}
|
|
||||||
{{ block('method') }}
|
|
||||||
{% endfor %}
|
|
||||||
{% for method in methods|sort_asc if method.visibility == 'protected' and (method.tags['overwritable-hook'] is defined or method.tags['extension-hook'] is defined) %}
|
|
||||||
{%- if loop.first %}
|
|
||||||
===== Protected methods =====
|
|
||||||
{% endif %}
|
|
||||||
{{ block('method') }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% set constants = node.inheritedConstants.merge(node.constants) %}
|
|
||||||
{% if constants|length > 0 %}
|
|
||||||
===== Constants =====
|
|
||||||
{% for constant in constants|sort_asc %}
|
|
||||||
{{ block('constant') }}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
{#{% set properties = node.inheritedProperties.merge(node.properties.merge(node.magicProperties)) %}#}
|
|
||||||
{#{% for property in properties|sort_asc if property.visibility == 'public' %}#}
|
|
||||||
{#{%- if loop.first %}#}
|
|
||||||
{#===== Public properties =====#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{{ block('property') }}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{% for property in properties|sort_asc if property.visibility == 'protected' %}#}
|
|
||||||
{#{%- if loop.first %}#}
|
|
||||||
{#===== Protected properties =====#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{{ block('property') }}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
|
|
||||||
|
|
||||||
{%- endif %} {#{% elseif node.tags['xxx'] is not defined and ... #}
|
|
||||||
|
|
||||||
<wrap button>[[start|🔙 Back]]</wrap>
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
{% block constant %}
|
|
||||||
|
|
||||||
<WRAP group box >
|
|
||||||
<WRAP twothirds column >
|
|
||||||
==== {{ constant.name }} ====
|
|
||||||
</WRAP>{# twothirds column#}
|
|
||||||
|
|
||||||
<WRAP third column>
|
|
||||||
{% if constant.deprecated %}<wrap danger>deprecated</wrap> {% endif %}
|
|
||||||
{% if (node.parent is not null and constant.parent.fullyQualifiedStructuralElementName != node.fullyQualifiedStructuralElementName) %}<wrap notice>inherited</wrap> {% endif %}
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
|
|
||||||
== {{ constant.summary|replace({"\n":""})|raw }} ==
|
|
||||||
<html>{{ constant.description|markdown|raw }}</html>
|
|
||||||
|
|
||||||
{% if constant.deprecated %}
|
|
||||||
=== Deprecated ===
|
|
||||||
{{ constant.tags.deprecated[0].description|raw }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% include 'includes/inherited-from.txt.twig' with {structure:constant} %}
|
|
||||||
|
|
||||||
{% include 'includes/see-also.txt.twig' with {structure:constant, title_level: '=='} %}
|
|
||||||
|
|
||||||
{% include 'includes/uses.txt.twig' with {structure:constant, title_level: '=='} %}
|
|
||||||
|
|
||||||
{% include 'includes/tags.txt.twig' with {structure:constant, title_level: '==', blacklist: ['link', 'see', 'var', 'deprecated', 'uses', 'package', 'subpackage', 'todo', 'code-example']} %}
|
|
||||||
|
|
||||||
</WRAP>{# group #}
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
{% block method %}
|
|
||||||
|
|
||||||
|
|
||||||
<WRAP group box >
|
|
||||||
<WRAP twothirds column >
|
|
||||||
==== {{ method.name }} ====
|
|
||||||
</WRAP>{# twothirds column#}
|
|
||||||
<WRAP third column >
|
|
||||||
{% include 'includes/wrap-tags.txt.twig' with {structure:method, wrap: 'safety', wrapTags: ['api', 'api-advanced', 'overwritable-hook', 'extension-hook']} %}
|
|
||||||
{% if method.deprecated %}<wrap danger>deprecated</wrap> {% endif %}
|
|
||||||
{% if (node.parent is not null and method.parent.fullyQualifiedStructuralElementName != node.fullyQualifiedStructuralElementName) %}<wrap notice>inherited</wrap> {% endif %}
|
|
||||||
{% if method.abstract %}<wrap warning>abstract</wrap> {% endif %}
|
|
||||||
{% if method.final %}<wrap notice>final</wrap> {% endif %}
|
|
||||||
<wrap notice>{{ method.visibility }}</wrap>
|
|
||||||
{% if method.static %}<wrap warning>static</wrap> {% endif %}
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
|
|
||||||
|
|
||||||
== {{ method.summary|replace({"\n":""})|raw }} ==
|
|
||||||
<html>{{ method.description|markdown|raw }}</html>
|
|
||||||
|
|
||||||
<code php>{% if method.abstract %}abstract {% endif %}{% if method.final %}final {% endif %}{{ method.visibility }} {% if method.static %}static {% endif %}{{ method.name }}({% for argument in method.arguments %}{{ argument.isVariadic ? '...' }}{{ argument.name }}{{ argument.default ? (' = '~argument.default)|raw }}{% if not loop.last %}, {% endif %}{% endfor %})</code>
|
|
||||||
|
|
||||||
<WRAP twothirds column >
|
|
||||||
|
|
||||||
|
|
||||||
=== Parameters ===
|
|
||||||
{% if method.arguments|length > 0 -%}
|
|
||||||
^ types ^ name ^ default ^ description ^
|
|
||||||
{% for argument in method.arguments -%}
|
|
||||||
| **<nowiki>{{ argument.types|join('|')|raw }}</nowiki>** | {{ argument.name }} {{ argument.isVariadic ? '<small style="color: gray">variadic</small>' }} | <nowiki>{{ argument.default|raw }}</nowiki> | {{ argument.description|trim|replace("\n", ' ')|raw }} |{{ "\r\n" }}
|
|
||||||
{%- endfor %}
|
|
||||||
{% else %}
|
|
||||||
//none//
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
{#=== Parameters ===#}
|
|
||||||
{#{% if method.arguments|length > 0 -%}#}
|
|
||||||
{#{% for argument in method.arguments -%}#}
|
|
||||||
{#== {{ argument.name }} ==#}
|
|
||||||
|
|
||||||
|
|
||||||
{#{% set varDesc %}#}
|
|
||||||
{#<span style="margin:0 10px; 0 20px; font-weight: bold;">{{ argument.types|join('|') }}</span>#}
|
|
||||||
{#{{ argument.isVariadic ? '<small style="color: gray">variadic</small>' }}#}
|
|
||||||
{#{{ argument.description|raw }}#}
|
|
||||||
{#{% endset %}#}
|
|
||||||
{#<html>{{ varDesc|markdown|raw }}</html>#}
|
|
||||||
{#{%- endfor %}#}
|
|
||||||
{#{% else %}#}
|
|
||||||
{#<wrap tip>This method has no parameter</wrap>#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
|
|
||||||
|
|
||||||
{% if method.response and method.response.types|join() != 'void' %}
|
|
||||||
=== Returns ===
|
|
||||||
<html>{{ ('**' ~ method.response.types|join('|')|trim ~ '** ' ~ method.response.description)|markdown|raw }}</html>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
</WRAP>{# twothirds column#}
|
|
||||||
|
|
||||||
<WRAP third column >
|
|
||||||
|
|
||||||
{% if method.tags.throws|length > 0 or method.tags.throw|length > 0 %}
|
|
||||||
=== Throws ===
|
|
||||||
{% for exception in method.tags.throws -%}
|
|
||||||
{% if loop.length > 1 %} * {% endif %}''{{ exception.types|join('|')|raw }}'' <nowiki>{{ exception.description|raw }}</nowiki>
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% include 'includes/inherited-from.txt.twig' with {structure:method} %}
|
|
||||||
|
|
||||||
{% include 'includes/see-also.txt.twig' with {structure:method, title_level: '==='} %}
|
|
||||||
|
|
||||||
{% include 'includes/uses.txt.twig' with {structure:method, title_level: '==='} %}
|
|
||||||
|
|
||||||
{% include 'includes/used-by.txt.twig' with {structure:method, title_level: '==='} %}
|
|
||||||
|
|
||||||
{% include 'includes/tags-with-description.txt.twig' with {structure:method, title_level: '===', WRAP: 'info', tagsWithDescription: ['api', 'api-advanced', 'overwritable-hook', 'extension-hook']} %}
|
|
||||||
|
|
||||||
{% include 'includes/tags.txt.twig' with {structure:method, title_level: '===', blacklist: ['todo', 'link', 'see', 'abstract', 'example', 'param', 'return', 'access', 'deprecated', 'throws', 'throw', 'uses', 'api', 'api-advanced', 'overwritable-hook', 'extension-hook', 'used-by', 'inheritdoc', 'code-example']} %}
|
|
||||||
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% include 'includes/code-examples.txt.twig' with {structure:method, title_level: '==='} %}
|
|
||||||
|
|
||||||
</WRAP>{# group #}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
{% block property %}
|
|
||||||
|
|
||||||
<WRAP group box>
|
|
||||||
<WRAP twothirds column >
|
|
||||||
==== ${{ property.name }} ====
|
|
||||||
</WRAP>{# twothirds column#}
|
|
||||||
|
|
||||||
<WRAP third column>
|
|
||||||
{% if property.deprecated %}<wrap danger>deprecated</wrap> {% endif %}
|
|
||||||
{% if (node.parent is not null and property.parent.fullyQualifiedStructuralElementName != node.fullyQualifiedStructuralElementName) %}<wrap notice>inherited</wrap> {% endif %}
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
== {{ property.summary|replace({"\n":""})|raw }} ==
|
|
||||||
<html>{{ property.description|markdown|raw }}</html>
|
|
||||||
{% if property.var.0.description %}<html>{{ property.var.0.description|markdown|raw }}</html>{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{#{% if property.types %}#}
|
|
||||||
{#== Type ==#}
|
|
||||||
{#{% for type in property.types %}#}
|
|
||||||
{#{% if loop.length > 1 %} * {% endif %}{{ type|raw }} : {{ type.description|raw }}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{{ property.types|join('|')|raw }}#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
|
|
||||||
|
|
||||||
{% if property.deprecated %}
|
|
||||||
== Deprecated ==
|
|
||||||
{{ property.tags.deprecated[0].description }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% include 'includes/inherited-from.txt.twig' with {structure:property} %}
|
|
||||||
|
|
||||||
{% include 'includes/see-also.txt.twig' with {structure:property, title_level: '=='} %}
|
|
||||||
|
|
||||||
{% include 'includes/uses.txt.twig' with {structure:property, title_level: ''} %}
|
|
||||||
|
|
||||||
{% include 'includes/tags.txt.twig' with {structure:property, title_level: '==', blacklist: ['link', 'see', 'access', 'var', 'deprecated', 'uses', 'todo', 'code-example']} %}
|
|
||||||
|
|
||||||
|
|
||||||
<code php>{{ property.visibility }} ${{ property.name }}{% if property.types %} : {{ property.types|join('|')|raw }}{% endif %}</code>
|
|
||||||
|
|
||||||
</WRAP>{# group #}
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{{ node.source|raw }}
|
|
||||||
@@ -1,122 +0,0 @@
|
|||||||
{% extends 'layout.txt.twig' %}
|
|
||||||
|
|
||||||
{% block javascripts %}
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
{#<section class="row-fluid">#}
|
|
||||||
{#<div class="span2 sidebar">#}
|
|
||||||
{#{% set namespace = project.namespace %}#}
|
|
||||||
{#{{ block('sidebarNamespaces') }}#}
|
|
||||||
{#</div>#}
|
|
||||||
{#</section>#}
|
|
||||||
{#<section class="row-fluid">#}
|
|
||||||
====== {{ node.path|split('/')|slice(0,-1)|join('/') }}{{ node.name }} ======
|
|
||||||
{{ node.summary }}
|
|
||||||
<html>{{ node.description|markdown|raw }}</html>
|
|
||||||
|
|
||||||
{% if node.traits|length > 0 %}
|
|
||||||
|
|
||||||
===== Traits =====
|
|
||||||
{% for trait in node.traits %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ trait|raw }}</td>
|
|
||||||
<td><em>{{ trait.summary }}</em></td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
{% if node.interfaces|length > 0 %}
|
|
||||||
===== Interfaces =====
|
|
||||||
{% for interface in node.interfaces %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ interface|raw }}</td>
|
|
||||||
<td><em>{{ interface.summary }}</em></td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if node.classes|length > 0 %}
|
|
||||||
===== Classes =====
|
|
||||||
{% for class in node.classes %}
|
|
||||||
{{ class|raw }}
|
|
||||||
<em>{{ class.summary }}</em>
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if node.package is not empty and node.package != '\\' %}
|
|
||||||
===== Package =====
|
|
||||||
{{ node.subpackage ? (node.package ~ '\\' ~ node.subpackage) : node.package }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% for tagName,tags in node.tags if tagName in ['link', 'see'] %}
|
|
||||||
{% if loop.first %}
|
|
||||||
===== See also =====
|
|
||||||
{% endif %}
|
|
||||||
{% for tag in tags %}
|
|
||||||
<dd><a href="{{ tag.reference ?: tag.link }}"><div class="namespace-wrapper">{{ tag.description ?: tag.reference }}</div></a></dd>
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
<h2>Tags</h2>
|
|
||||||
<table class="table table-condensed">
|
|
||||||
{% for tagName,tags in node.tags if tagName not in ['link', 'see', 'package', 'subpackage'] %}
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
{{ tagName }}
|
|
||||||
</th>
|
|
||||||
<td>
|
|
||||||
{% for tag in tags %}
|
|
||||||
{{ tag.description|markdown|raw }}
|
|
||||||
{% endfor %}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% else %}
|
|
||||||
<tr><td colspan="2"><em>None found</em></td></tr>
|
|
||||||
{% endfor %}
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</aside>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if node.constants|length > 0 %}
|
|
||||||
<div class="row-fluid">
|
|
||||||
<section class="span8 content file">
|
|
||||||
<h2>Constants</h2>
|
|
||||||
</section>
|
|
||||||
<aside class="span4 detailsbar"></aside>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% for constant in node.constants %}
|
|
||||||
{{ block('constant') }}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if node.functions|length > 0 %}
|
|
||||||
<div class="row-fluid">
|
|
||||||
<section class="span8 content file">
|
|
||||||
<h2>Functions</h2>
|
|
||||||
</section>
|
|
||||||
<aside class="span4 detailsbar"></aside>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% for method in node.functions %}
|
|
||||||
{{ block('method') }}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<div id="source-view" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="source-view-label" aria-hidden="true">
|
|
||||||
<div class="modal-header">
|
|
||||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
|
||||||
<h3 id="source-view-label">{{ node.file.name }}</h3>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<pre data-src="{{ path('files/' ~ node.path ~ '.txt')|raw }}" class="language-php line-numbers"></pre>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
{% extends 'layout.html.twig' %}
|
|
||||||
|
|
||||||
{% block stylesheets %}
|
|
||||||
<link href="{{ path('css/jquery.iviewer.css') }}" rel="stylesheet" media="all"/>
|
|
||||||
<style>
|
|
||||||
#viewer {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.wrapper {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block javascripts %}
|
|
||||||
<script src="{{ path('js/jquery.mousewheel.js') }}" type="text/javascript"></script>
|
|
||||||
<script src="{{ path('js/jquery.iviewer.js') }}" type="text/javascript"></script>
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(window).resize(function(){
|
|
||||||
$("#viewer").height($(window).height() - 100);
|
|
||||||
});
|
|
||||||
|
|
||||||
$(document).ready(function() {
|
|
||||||
$("#viewer").iviewer({src: '{{ path('graphs/classes.svg') }}', zoom_animation: false});
|
|
||||||
$('#viewer img').bind('dragstart', function(event){
|
|
||||||
event.preventDefault();
|
|
||||||
});
|
|
||||||
$(window).resize();
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="row-fluid">
|
|
||||||
<div class="span12">
|
|
||||||
<div class="wrapper">
|
|
||||||
<div id="viewer" class="viewer"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# Fixes a vulnerability in CentOS: http://stackoverflow.com/questions/20533279/prevent-php-from-parsing-non-php-files-such-as-somefile-php-txt
|
|
||||||
<FilesMatch \.php\.txt$>
|
|
||||||
RemoveHandler .php
|
|
||||||
ForceType text/plain
|
|
||||||
</FilesMatch>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
{% if title_level is not defined %}
|
|
||||||
{%- set title_level = '==' -%}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if sub_title_level is not defined %}
|
|
||||||
{%- set sub_title_level = title_level|slice(1) -%}
|
|
||||||
{% endif %}
|
|
||||||
{% if sub_title_level == '=' %}
|
|
||||||
{%- set sub_title_level = '' -%}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{#{% for tagName,tags in structure.tags if tagName in ['code-example'] %}#}
|
|
||||||
{#{% if loop.first %}#}
|
|
||||||
{#{{title_level}} Examples {{title_level}}#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{% for tag in tags %}#}
|
|
||||||
{#{%- set descToken = tag.description|split("\n", 2) -%}#}
|
|
||||||
{#{%- set title = descToken[0] -%}#}
|
|
||||||
{#{%- set code = descToken[1] -%}#}
|
|
||||||
{#{{sub_title_level}} {{ title }} {{sub_title_level}}#}
|
|
||||||
{#<code php>{{ code|raw }}</code>#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
|
|
||||||
|
|
||||||
{% for tagName,tags in structure.tags if tagName in ['example'] %}
|
|
||||||
{% if loop.first %}
|
|
||||||
{{title_level}} Examples {{title_level}}
|
|
||||||
{% endif %}
|
|
||||||
{% for tag in tags %}
|
|
||||||
{{ sub_title_level }} {{ tag.filePath|escape }}{{ sub_title_level }}
|
|
||||||
<code php>{{ tag.description|raw }}</code>
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
{% if title_level is not defined %}
|
|
||||||
{% set title_level='' %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if (node.parent is null) %}
|
|
||||||
{{title_level}} File {{ structure.path }} {{title_level}}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if (node.parent is not null and structure.parent.fullyQualifiedStructuralElementName != node.fullyQualifiedStructuralElementName) %}
|
|
||||||
{{title_level}} Inherited from {{title_level}}
|
|
||||||
[[{{structure.parent}}|{{structure.parent}}]]
|
|
||||||
{% endif %}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
{% for structure in structures|sort_asc if structure.tags['internal'] is not defined and (structure.tags['api'] is defined or structure.tags['api-advanced'] is defined or structure.tags['overwritable-hook'] is defined or structure.tags['extension-hook'] is defined ) %}
|
|
||||||
{#{{ structure|raw }}#}
|
|
||||||
|
|
||||||
{% set structureName = structure|trim('\\', 'left') %}
|
|
||||||
|
|
||||||
<WRAP group box>
|
|
||||||
<WRAP twothirds column >
|
|
||||||
==== {{ structureName }} ====
|
|
||||||
</WRAP>{# twothirds column#}
|
|
||||||
|
|
||||||
<WRAP third column>
|
|
||||||
{% if structure.deprecated %}<wrap danger>deprecated</wrap>{% endif %}
|
|
||||||
{% if structure.abstract %}<wrap warning>abstract</wrap>{% endif %}
|
|
||||||
{% if structure.final %}<wrap notice>final</wrap>{% endif %}
|
|
||||||
{% if (node.parent is not null and structure.parent.fullyQualifiedStructuralElementName != node.fullyQualifiedStructuralElementName) %}<wrap notice>inherited</wrap> {% endif %}
|
|
||||||
{% include 'includes/wrap-tags.txt.twig' with {structure:structure, wrap: 'safety', wrapTags: ['api', 'api-advanced', 'overwritable-hook', 'extension-hook']} %}
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
|
|
||||||
|
|
||||||
{{ structure.summary|raw }}
|
|
||||||
[[{{structureName}}|More information]]
|
|
||||||
|
|
||||||
</WRAP>{# group #}
|
|
||||||
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
{% if title_level is not defined %}
|
|
||||||
{%- set title_level='==' -%}
|
|
||||||
{% endif %}
|
|
||||||
{% for tagName,tags in structure.tags if tagName in ['link', 'see'] %}
|
|
||||||
{% if loop.first %}
|
|
||||||
{{title_level}} See also {{title_level}}
|
|
||||||
{% endif %}
|
|
||||||
{% for tag in tags %}
|
|
||||||
{%- set linkTag = tag.reference|trim('\\', 'left') -%}
|
|
||||||
{% if not('()' in linkTag or '$' in linkTag or node.name in linkTag or '::' in linkTag ) %}
|
|
||||||
{%- set linkTag = linkTag|lower -%}
|
|
||||||
{% elseif node.name~'::' in linkTag %}
|
|
||||||
{%- set linkTag = linkTag|replace({(node.name~'::'): '#'})|lower -%}
|
|
||||||
{% elseif '::' in linkTag -%}
|
|
||||||
{%- set linkTag = linkTag|replace({'::': '#'})|lower -%}
|
|
||||||
{% else %}
|
|
||||||
{%- set linkTag = '#' ~ linkTag|lower -%}
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
{% if loop.length > 1 %} * {% endif %}{% if tag.reference is not empty -%}
|
|
||||||
[[{{linkTag}}|{{ (tag.reference)|trim('\\', 'left') }}]] {% if tag.description|trim is not empty %}: {{ tag.description|trim('\\', 'left') }} {% endif %}
|
|
||||||
{%- else -%}
|
|
||||||
{#{{ tag.description|trim('\\', 'left') }}#}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
{% if tag is not defined -%}
|
|
||||||
{# Do not display @api if @api-advanced is also present #}
|
|
||||||
{%- set tag = "api" -%}
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
{% if hidden_by is not defined -%}
|
|
||||||
{# Do not display @api if @api-advanced is also present #}
|
|
||||||
{%- set hidden_by = {"api" : "api-advanced"} -%}
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% for method in methods|sort_asc
|
|
||||||
if (method.visibility == 'public')
|
|
||||||
and (
|
|
||||||
method.tags[tag] is defined
|
|
||||||
and (
|
|
||||||
hidden_by[tag] is not defined or method.tags[hidden_by[tag]] is not defined
|
|
||||||
)
|
|
||||||
)
|
|
||||||
%}
|
|
||||||
{%- if loop.first %}
|
|
||||||
{% if tag == 'api' %}
|
|
||||||
===== API synthesis =====
|
|
||||||
<WRAP>
|
|
||||||
List of the public API methods.
|
|
||||||
When manipulating {{ node.name }}, You can call those methods:
|
|
||||||
</WRAP>
|
|
||||||
{% elseif tag == 'api-advanced' %}
|
|
||||||
===== Advanced API synthesis =====
|
|
||||||
<WRAP>
|
|
||||||
List of advanced API methods
|
|
||||||
Beware they usage is recommended to advanced users only.
|
|
||||||
</WRAP>
|
|
||||||
{% elseif tag == 'overwritable-hook' %}
|
|
||||||
===== overwritable-hook synthesis =====
|
|
||||||
<WRAP >When inheriting from {{ node.name }},
|
|
||||||
you can overwrite those methods in order to add custom logic:
|
|
||||||
</WRAP>
|
|
||||||
{% elseif tag == 'extension-hook' %}
|
|
||||||
===== extension-hook synthesis =====
|
|
||||||
<WRAP >
|
|
||||||
When inheriting from {{ node.name }},
|
|
||||||
you can extend the behaviour of iTop by implementing:
|
|
||||||
</WRAP>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
{% set sanitizedMethod = method|trim('\\', 'left')|replace({(node.name~'::'): ''}) %}
|
|
||||||
{% if '::' in sanitizedMethod -%}
|
|
||||||
{%- if node.tags['phpdoc-tuning-exclude-inherited'] is not defined %}
|
|
||||||
* [[{{sanitizedMethod|replace({'::': '#'})|lower}}|↪{{sanitizedMethod}}]] — {{ method.summary|replace({"\n":""})|raw }}
|
|
||||||
{% endif %}
|
|
||||||
{%- else %}
|
|
||||||
* [[#{{sanitizedMethod}}|{{sanitizedMethod}}]] — {{ method.summary|replace({"\n":""})|raw }}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
{% if title_level is not defined %}
|
|
||||||
{% set title_level = '==' %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
{%- for tagName,tags in structure.tags if tagName in tagsWithDescription -%}
|
|
||||||
{%- for tag in tags -%}
|
|
||||||
{%- if tag.description is not empty -%}
|
|
||||||
{%- if WRAP is defined -%}
|
|
||||||
<WRAP {{WRAP}}>
|
|
||||||
{%- endif -%}
|
|
||||||
{{title_level}} {{ tagName }} {{title_level}}
|
|
||||||
{{ tag.description|escape }}
|
|
||||||
{%- if WRAP is defined -%}
|
|
||||||
</WRAP>
|
|
||||||
{%- endif -%}
|
|
||||||
{%- endif -%}
|
|
||||||
{%- endfor -%}
|
|
||||||
{%- endfor -%}
|
|
||||||
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
{% if title_level is not defined %}
|
|
||||||
{% set title_level='=====' %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if blacklist is not defined %}
|
|
||||||
{% set blacklist =['link', 'see', 'abstract', 'example', 'method', 'property', 'property-read', 'property-write', 'package', 'subpackage', 'api', 'api-advanced', 'todo', 'code-example'] %}
|
|
||||||
{% endif %}
|
|
||||||
{% if hidden_by is not defined -%}
|
|
||||||
{# Do not display @api if @api-advanced is also present #}
|
|
||||||
{%- set hidden_by = {"api" : "api-advanced"} -%}
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
{#^ {% for tagName,tags in structure.tags if tagName not in blacklist -%}#}
|
|
||||||
{#{{ tagName }} ^#}
|
|
||||||
{#{%- endfor %}#}
|
|
||||||
|
|
||||||
{% for tagName,tags in structure.tags if tagName not in blacklist and (hidden_by[tagName] is not defined or structure.tags[hidden_by[tagName]] is not defined) %}
|
|
||||||
{%- if loop.first %}
|
|
||||||
{{title_level}} Tags {{title_level}}
|
|
||||||
{% endif %}
|
|
||||||
^ {{ tagName }} | {% for tag in tags %}{{ tag.version ? tag.version ~ ' ' : '' }}{{ tag.description}}{% endfor %} |
|
|
||||||
{% endfor %}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
{% if title_level is not defined %}
|
|
||||||
{% set title_level='' %}
|
|
||||||
{% endif %}
|
|
||||||
{% for tagName,tags in structure.tags if tagName in ['used-by'] %}
|
|
||||||
{% if loop.first %}
|
|
||||||
{{title_level}} Used by {{title_level}}
|
|
||||||
{% endif %}
|
|
||||||
{% for tag in tags %}
|
|
||||||
{% if loop.length > 1 %} * {% endif %}{{ tag.reference ?: tag.link }} : {{ tag.description ?: tag.reference }}
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{#{% for tagName,tags in method.tags if tagName in ['uses'] %}#}
|
|
||||||
{#{% if loop.first %}#}
|
|
||||||
{#<dt>Uses</dt>#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{% for tag in tags %}#}
|
|
||||||
{#<dd>{{ tag.reference|raw }}</dd>#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
{% if title_level is not defined %}
|
|
||||||
{% set title_level='' %}
|
|
||||||
{% endif %}
|
|
||||||
{% for tagName,tags in structure.tags if tagName in ['uses'] %}
|
|
||||||
{% if loop.first %}
|
|
||||||
{{title_level}} Uses {{title_level}}
|
|
||||||
{% endif %}
|
|
||||||
{% for tag in tags %}
|
|
||||||
{% if loop.length > 1 %} * {% endif %}{{ tag.reference ?: tag.link }} : {{ tag.description ?: tag.reference }}
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{#{% for tagName,tags in method.tags if tagName in ['uses'] %}#}
|
|
||||||
{#{% if loop.first %}#}
|
|
||||||
{#<dt>Uses</dt>#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{% for tag in tags %}#}
|
|
||||||
{#<dd>{{ tag.reference|raw }}</dd>#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
{% if wrap is not defined -%}
|
|
||||||
{% set wrap = 'notice' %}
|
|
||||||
{%- endif -%}
|
|
||||||
{% if hidden_by is not defined -%}
|
|
||||||
{# Do not display @api if @api-advanced is also present #}
|
|
||||||
{%- set hidden_by = {"api" : "api-advanced"} -%}
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
{%- for tagName,tags in structure.tags if tagName in wrapTags and (hidden_by[tagName] is not defined or structure.tags[hidden_by[tagName]] is not defined) %}
|
|
||||||
<wrap {{wrap}}>{{tagName}}</wrap>
|
|
||||||
{% endfor %}
|
|
||||||
@@ -1,121 +0,0 @@
|
|||||||
{% extends 'layout.txt.twig' %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<wrap button>[[start|🔙 Back]]</wrap>
|
|
||||||
|
|
||||||
{% if node.tags['internal'] is defined %}
|
|
||||||
====== {{ node.name }} ======
|
|
||||||
<WRAP alert>This interface is "internal", and thus is not documented!</WRAP>
|
|
||||||
{% elseif node.tags['api'] is not defined and node.tags['api-advanced'] is not defined and node.tags['overwritable-hook'] is not defined and node.tags['extension-hook'] is not defined %}
|
|
||||||
====== {{ node.name }} ======
|
|
||||||
<WRAP alert>This interface is neither "api", "overwritable-hook" or "extension-hook", and thus is not documented!</WRAP>
|
|
||||||
{% else %}
|
|
||||||
|
|
||||||
====== {{ node.name }} ======
|
|
||||||
|
|
||||||
{% if node.deprecated %}<wrap danger>deprecated</wrap>{% endif %}
|
|
||||||
{% if node.abstract %}<wrap warning>abstract</wrap>{% endif %}
|
|
||||||
{% if node.final %}<wrap notice>final</wrap>{% endif %}
|
|
||||||
{% include 'includes/wrap-tags.txt.twig' with {structure:node, wrap: 'safety', wrapTags: ['api', 'api-advanced', 'overwritable-hook', 'extension-hook']} %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% if node.deprecated %}
|
|
||||||
=== **<del>Deprecated</del>**===
|
|
||||||
//{{ node.tags.deprecated[0].description }}//
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
== {{ node.summary|replace({"\n":""})|raw }} ==
|
|
||||||
<html>{{ node.description|markdown|raw }}</html>
|
|
||||||
|
|
||||||
|
|
||||||
{% include 'includes/code-examples.txt.twig' with {structure:node, title_level: '====='} %}
|
|
||||||
|
|
||||||
|
|
||||||
{% set class = node.parent %}
|
|
||||||
{% block hierarchy_element %}
|
|
||||||
|
|
||||||
{% if class and class.name is defined and class.name|trim != '' %}
|
|
||||||
==== parent ====
|
|
||||||
{% set child = class %}
|
|
||||||
{% set class = class.parent %}
|
|
||||||
{{ block('hierarchy_element') }}
|
|
||||||
[[{{ child.name }}|{{ child.name }}]]
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
|
|
||||||
{% for interface in node.interfaces|sort_asc %}
|
|
||||||
{% if loop.first %}
|
|
||||||
==== Implements ====
|
|
||||||
{% endif %}
|
|
||||||
{% if loop.length > 1 %} * {% endif %}{{ interface.fullyQualifiedStructuralElementName ?: interface }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
{% for trait in node.usedTraits|sort_asc %}
|
|
||||||
{% if loop.first %}
|
|
||||||
==== Uses traits ====
|
|
||||||
{% endif %}
|
|
||||||
{% if loop.length > 1 %} * {% endif %}{{ trait.fullyQualifiedStructuralElementName ?: trait }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
{% include 'includes/see-also.txt.twig' with {structure:node, title_level: '==='} %}
|
|
||||||
|
|
||||||
{% include 'includes/tags.txt.twig' with {structure:node, title_level: '=====', blacklist: ['link', 'see', 'abstract', 'example', 'method', 'property', 'property-read', 'property-write', 'package', 'subpackage', 'phpdoc-tuning-exclude-inherited', 'api', 'api-advanced', 'overwritable-hook', 'extension-hook', 'copyright', 'license', 'code-example']} %}
|
|
||||||
|
|
||||||
|
|
||||||
{% set methods = node.inheritedMethods.merge(node.methods) %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'api'} %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'api-advanced'} %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'overwritable-hook'} %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'extension-hook'} %}
|
|
||||||
|
|
||||||
<WRAP clear />
|
|
||||||
|
|
||||||
|
|
||||||
{% for method in methods|sort_asc if method.visibility == 'public' %}
|
|
||||||
{%- if loop.first %}
|
|
||||||
===== Public methods =====
|
|
||||||
{% endif %}
|
|
||||||
{{ block('method') }}
|
|
||||||
{% endfor %}
|
|
||||||
{% for method in methods|sort_asc if method.visibility == 'protected' %}
|
|
||||||
{%- if loop.first %}
|
|
||||||
===== Protected methods =====
|
|
||||||
{% endif %}
|
|
||||||
{{ block('method') }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% set constants = node.inheritedConstants.merge(node.constants) %}
|
|
||||||
{% if constants|length > 0 %}
|
|
||||||
===== Constants =====
|
|
||||||
{% for constant in constants|sort_asc %}
|
|
||||||
{{ block('constant') }}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
{#{% set properties = node.inheritedProperties.merge(node.properties) %}#}
|
|
||||||
{#{% for property in properties|sort_asc if property.visibility == 'public' %}#}
|
|
||||||
{#{%- if loop.first %}#}
|
|
||||||
{#===== Public properties =====#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{{ block('property') }}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{% for property in properties|sort_asc if property.visibility == 'protected' %}#}
|
|
||||||
{#{%- if loop.first %}#}
|
|
||||||
{#===== Protected properties =====#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{{ block('property') }}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
|
|
||||||
|
|
||||||
{%- endif %} {#{% elseif node.tags['xxx'] is not defined and ... #}
|
|
||||||
|
|
||||||
<wrap button>[[start|🔙 Back]]</wrap>
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
{% use 'elements/constant.txt.twig' %}
|
|
||||||
{% use 'elements/property.txt.twig' %}
|
|
||||||
{% use 'elements/method.txt.twig' %}
|
|
||||||
|
|
||||||
{% block content %}{% endblock %}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
{% extends 'layout.txt.twig' %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
{% set namespace = project.namespace %}
|
|
||||||
{{ block('sidebarNamespaces') }}
|
|
||||||
|
|
||||||
{#{{ node.parent|raw }}#}
|
|
||||||
{#====== {{ node.parent.fullyQualifiedStructuralElementName }}{{ node.name }} ======#}
|
|
||||||
|
|
||||||
{% if node.children|length > 0 %}
|
|
||||||
=====Namespaces=====
|
|
||||||
{% include 'includes/namespace-structure-toc.html.twig' with {structures: node.children} %}
|
|
||||||
----
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if node.traits|length > 0 %}
|
|
||||||
===== Traits =====
|
|
||||||
{% include 'includes/namespace-structure-toc.html.twig' with {structures: node.traits} %}
|
|
||||||
----
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
{% if node.interfaces|length > 0 %}
|
|
||||||
===== Interfaces =====
|
|
||||||
{% include 'includes/namespace-structure-toc.html.twig' with {structures: node.interfaces} %}
|
|
||||||
----
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if node.classes|length > 0 %}
|
|
||||||
===== Classes =====
|
|
||||||
{% include 'includes/namespace-structure-toc.html.twig' with {structures: node.classes} %}
|
|
||||||
----
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{#{% if node.constants|length > 0 %}#}
|
|
||||||
{#===== Constants =====#}
|
|
||||||
{#{% for constant in node.constants|sort_asc %}#}
|
|
||||||
{# {{ block('constant') }}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
|
|
||||||
{#{% if node.functions|length > 0 %}#}
|
|
||||||
{#===== Functions =====#}
|
|
||||||
|
|
||||||
{#{% for method in node.functions|sort_asc %}#}
|
|
||||||
{# {{ block('method') }}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
|
|
||||||
====== Deprecated elements ======
|
|
||||||
|
|
||||||
{#{% for element in project.indexes.elements if element.deprecated %}#}
|
|
||||||
{#{% if element.file.path != previousPath %}#}
|
|
||||||
{#<li><a href="#{{ element.file.path }}"><i class="icon-file"></i> {{ element.file.path }}</a></li>#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{% set previousPath = element.file.path %}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
|
|
||||||
{% for element in project.indexes.elements if element.deprecated %}
|
|
||||||
{% if element.file.path != previousPath %}
|
|
||||||
{% if previousPath %}
|
|
||||||
</WRAP>{# group #}
|
|
||||||
{% endif %}
|
|
||||||
{#<a name="{{ element.file.path }}" id="{{ element.file.path }}"></a>#}
|
|
||||||
===== {{ element.file.path }} ({{ element.tags.deprecated.count }} found)=====
|
|
||||||
|
|
||||||
<WRAP group >
|
|
||||||
<WRAP third column >
|
|
||||||
Element
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
<WRAP third column >
|
|
||||||
Line
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
<WRAP third column >
|
|
||||||
Description
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
|
|
||||||
{% endif %}
|
|
||||||
{% for tag in element.tags.deprecated %}
|
|
||||||
<WRAP group >
|
|
||||||
<WRAP third column >
|
|
||||||
{{ element.fullyQualifiedStructuralElementName }}
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
<WRAP third column >
|
|
||||||
{{ element.line }}
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
<WRAP third column >
|
|
||||||
{{ tag.description }}
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
|
|
||||||
{% endfor %}
|
|
||||||
</WRAP>{# group #}
|
|
||||||
{% set previousPath = element.file.path %}
|
|
||||||
{% else %}
|
|
||||||
<WRAP info>No deprecated elements have been found in this project.</WRAP>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<template>
|
|
||||||
<author>Bruno DA SILVA</author>
|
|
||||||
<email>contact [at] combodo.com</email>
|
|
||||||
<version>1.0.0</version>
|
|
||||||
<copyright>Combodo 2018</copyright>
|
|
||||||
<description><![CDATA[
|
|
||||||
|
|
||||||
Forked from the clean theme of https://github.com/phpDocumentor/phpDocumentor2 provided under the MIT licence.
|
|
||||||
The original work is copyright "Mike van Riel".
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
To improve performance you can add the following to your .htaccess:
|
|
||||||
|
|
||||||
<ifModule mod_deflate.c>
|
|
||||||
<filesMatch "\.(js|css|html)$">
|
|
||||||
SetOutputFilter DEFLATE
|
|
||||||
</filesMatch>
|
|
||||||
</ifModule>
|
|
||||||
]]></description>
|
|
||||||
<transformations>
|
|
||||||
<transformation writer="twig" query="namespace" source="templates/combodo-wiki/namespace.txt.twig" artifact="start.txt"/>
|
|
||||||
<transformation writer="twig" query="indexes.classes" source="templates/combodo-wiki/class.txt.twig" artifact="{{name}}.txt"/>
|
|
||||||
<transformation writer="twig" query="indexes.interfaces" source="templates/combodo-wiki/interface.txt.twig" artifact="{{name}}.txt" />
|
|
||||||
</transformations>
|
|
||||||
</template>
|
|
||||||
@@ -25,7 +25,7 @@ if (false === file_exists($sTcPdfRootFolder)) {
|
|||||||
echo $sCurrentScriptFileName.": No TCPDF lib detected, exiting !\n";
|
echo $sCurrentScriptFileName.": No TCPDF lib detected, exiting !\n";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$sTcPdfFontsFolder = $sTcPdfRootFolder.'/Fonts/';
|
$sTcPdfFontsFolder = $sTcPdfRootFolder.'/fonts/';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -25,12 +25,34 @@
|
|||||||
|
|
||||||
|
|
||||||
if (count($argv) === 1) {
|
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);
|
exit(1);
|
||||||
}
|
}
|
||||||
$sBaseReference = $argv[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
|
//--- Get log
|
||||||
$sGitLogCommand = 'git log --decorate --pretty="%h;%s" --date-order --no-merges '.$sBaseReference.'..HEAD';
|
$sGitLogCommand = 'git log --decorate --pretty="%h;%s" --date-order --no-merges '.$sBaseReference.'..HEAD';
|
||||||
$sGitLogRaw = shell_exec($sGitLogCommand);
|
$sGitLogRaw = shell_exec($sGitLogCommand);
|
||||||
@@ -73,5 +95,5 @@ echo "\n";
|
|||||||
echo "# Logs line without bug referenced\n";
|
echo "# Logs line without bug referenced\n";
|
||||||
echo "sha1;subject\n";
|
echo "sha1;subject\n";
|
||||||
foreach ($aLogLineNoBug as $sLogLine) {
|
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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -7,6 +7,17 @@ Here are some guidelines that will help us integrate your work!
|
|||||||
|
|
||||||
## Contributions
|
## Contributions
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
_ _ _ _ _ __ _
|
||||||
|
| | | | __ _ ___| | _| |_ ___ | |__ ___ _ __ / _| ___ ___| |_
|
||||||
|
| |_| |/ _` |/ __| |/ / __/ _ \| '_ \ / _ \ '__| |_ / _ \/ __| __|
|
||||||
|
| _ | (_| | (__| <| || (_) | |_) | __/ | | _| __/\__ \ |_
|
||||||
|
|_| |_|\__,_|\___|_|\_\\__\___/|_.__/ \___|_| |_| \___||___/\__|
|
||||||
|
```
|
||||||
|
This repository is part of Hacktoberfest. Contributions are welcome! Feel free to suggest improvements, add translation, fix bugs, or propose new features. Thank you for contributing !
|
||||||
|
|
||||||
|
|
||||||
### Subjects
|
### Subjects
|
||||||
You are welcome to create pull requests on any of those subjects:
|
You are welcome to create pull requests on any of those subjects:
|
||||||
|
|
||||||
@@ -161,4 +172,4 @@ We have one sticker per contribution type. You might get multiple stickers with
|
|||||||
|
|
||||||
Here is the design of each stickers for year 2024:
|
Here is the design of each stickers for year 2024:
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
24
README.md
24
README.md
@@ -1,4 +1,4 @@
|
|||||||
<p align="center"><a href="https://www.combodo.com/itop-193" target="_blank">
|
<p align="center"><a href="https://combodo.com" target="_blank">
|
||||||
<picture>
|
<picture>
|
||||||
<source media="(prefers-color-scheme: dark)" srcset="/images/logos/logo-itop-baseline-light.svg">
|
<source media="(prefers-color-scheme: dark)" srcset="/images/logos/logo-itop-baseline-light.svg">
|
||||||
<source media="(prefers-color-scheme: light)" srcset="/images/logos/logo-itop-baseline-dark.svg">
|
<source media="(prefers-color-scheme: light)" srcset="/images/logos/logo-itop-baseline-dark.svg">
|
||||||
@@ -53,7 +53,7 @@ iTop also offers mass import tools to help you become even more efficient.
|
|||||||
[4]: https://www.itophub.io/wiki/page?id=latest:install:requirements
|
[4]: https://www.itophub.io/wiki/page?id=latest:install:requirements
|
||||||
[5]: https://www.itophub.io/wiki
|
[5]: https://www.itophub.io/wiki
|
||||||
[6]: https://store.itophub.io/en_US/
|
[6]: https://store.itophub.io/en_US/
|
||||||
[7]: .doc/itop-version-history.md
|
[7]: itop-version-history.md
|
||||||
|
|
||||||
[10]: https://www.itophub.io/wiki/page?id=latest%3Adatamodel%3Astart#configuration_management_cmdb
|
[10]: https://www.itophub.io/wiki/page?id=latest%3Adatamodel%3Astart#configuration_management_cmdb
|
||||||
[11]: https://www.itophub.io/wiki/page?id=latest%3Adatamodel%3Astart#ticketing
|
[11]: https://www.itophub.io/wiki/page?id=latest%3Adatamodel%3Astart#ticketing
|
||||||
@@ -80,7 +80,9 @@ We would like to give a special thank you 🤗 to the people from the community
|
|||||||
|
|
||||||
### Names
|
### Names
|
||||||
|
|
||||||
|
- Al Hallak, Amr (a.k.a [@v4yne1](https://github.com/v4yne1))
|
||||||
- Alves, David
|
- Alves, David
|
||||||
|
- Audon, Florian
|
||||||
- Beck, Pedro
|
- Beck, Pedro
|
||||||
- Beer, Christian (a.k.a [@ChristianBeer](https://www.github.com/ChristianBeer))
|
- Beer, Christian (a.k.a [@ChristianBeer](https://www.github.com/ChristianBeer))
|
||||||
- Bilger, Jean-François
|
- Bilger, Jean-François
|
||||||
@@ -92,19 +94,27 @@ We would like to give a special thank you 🤗 to the people from the community
|
|||||||
- Colantoni, Maria Laura
|
- Colantoni, Maria Laura
|
||||||
- Couronné, Guy
|
- Couronné, Guy
|
||||||
- Dejin, Bie (a.k.a [@bdejin](https://github.com/bdejin))
|
- Dejin, Bie (a.k.a [@bdejin](https://github.com/bdejin))
|
||||||
|
- Delicado, Elodie
|
||||||
- Dvořák, Lukáš
|
- Dvořák, Lukáš
|
||||||
- Goethals, Stefan
|
- Goethals, Stefan
|
||||||
|
- Giuva, Vincenzo Katriel (a.k.a [@DarkNight97boss](https://github.com/DarkNight97boss))
|
||||||
- Gumble, David
|
- Gumble, David
|
||||||
|
- Håkon, Harnes (a.k.a [@hakonharnes](https://github.com/hakonharnes))
|
||||||
|
- Heloir, Arthur
|
||||||
|
- Janssens, Jelle (a.k.a [@janssensjelle](https://github.com/janssensjelle))
|
||||||
- Ji, Leeb (冀利斌) (a.k.a [@chileeb](https://github.com/chileeb))
|
- Ji, Leeb (冀利斌) (a.k.a [@chileeb](https://github.com/chileeb))
|
||||||
- Kaltefleiter, Lars (a.k.a [@larhip](https://www.github.com/larhip))
|
- Kaltefleiter, Lars (a.k.a [@larhip](https://www.github.com/larhip))
|
||||||
- Khamit, Shamil
|
- Khamit, Shamil
|
||||||
- Kincel, Martin
|
- Kincel, Martin
|
||||||
- Konečný, Kamil
|
- Konečný, Kamil
|
||||||
- Kunin, Vladimir
|
- Kunin, Vladimir
|
||||||
- Lassiter, Dennis
|
- Lassiter, Denis (a.k.a [@delassiter](https://github.com/delassiter))
|
||||||
- Lazcano, Federico
|
- Lazcano, Federico
|
||||||
- Lucas, Jonathan
|
- Lucas, Jonathan
|
||||||
- Malik, Remie
|
- Malik, Remie
|
||||||
|
- Mantel, Ina
|
||||||
|
- Martin, Pierre (a.k.a [@Worty](https://github.com/worty-syn))
|
||||||
|
- Melchiorre, Romain
|
||||||
- Mindêllo de Andrade, Lucas (a.k.a [@rokam](https://www.github.com/rokam))
|
- Mindêllo de Andrade, Lucas (a.k.a [@rokam](https://www.github.com/rokam))
|
||||||
- Mozart de Oliveira, Eduardo (a.k.a [@eduardomozart](https://github.com/eduardomozart))
|
- Mozart de Oliveira, Eduardo (a.k.a [@eduardomozart](https://github.com/eduardomozart))
|
||||||
- Raenker, Martin
|
- Raenker, Martin
|
||||||
@@ -116,10 +126,12 @@ We would like to give a special thank you 🤗 to the people from the community
|
|||||||
- Seki, Shoji
|
- Seki, Shoji
|
||||||
- Shilov, Vladimir
|
- Shilov, Vladimir
|
||||||
- Stetina, Pavel (a.k.a [@Stetinac](https://github.com/Stetinac))
|
- Stetina, Pavel (a.k.a [@Stetinac](https://github.com/Stetinac))
|
||||||
- Stukalov, Ilya (a.k.a [@ilya](https://www.github.com/ilya)-stukalov)
|
- Stukalov, Ilya (a.k.a [@ilya](https://www.github.com/ilya-stukalov))
|
||||||
- Tarjányi, Csaba (a.k.a [@tacsaby](https://github.com/tacsaby))
|
- Tarjányi, Csaba (a.k.a [@tacsaby](https://github.com/tacsaby))
|
||||||
|
- Toraya, Chairat (a.k.a [@Kyokito1412](https://github.com/Kyokito1412))
|
||||||
- Tulio, Marco
|
- Tulio, Marco
|
||||||
- Turrubiates, Miguel
|
- Turrubiates, Miguel
|
||||||
|
- Višnjić, Aldin (a.k.a[@viliald](https://github.com/viliald))
|
||||||
- Vlk, Karel (a.k.a [@vlk-charles](https://www.github.com/vlk-charles))
|
- Vlk, Karel (a.k.a [@vlk-charles](https://www.github.com/vlk-charles))
|
||||||
|
|
||||||
### Aliases
|
### Aliases
|
||||||
@@ -141,4 +153,6 @@ We would like to give a special thank you 🤗 to the people from the community
|
|||||||
- [ITOMIG](https://www.itomig.de/)
|
- [ITOMIG](https://www.itomig.de/)
|
||||||
- [Pimkie](https://www.pimkie.com/)
|
- [Pimkie](https://www.pimkie.com/)
|
||||||
- [Super-Visions](https://www.super-visions.com/)
|
- [Super-Visions](https://www.super-visions.com/)
|
||||||
|
- [Defence Tech Cyber Security - Malware Lab](https://github.com/DefenceTechSecurity)
|
||||||
|
- Orange Cyberdefense
|
||||||
|
- MipihSIB
|
||||||
|
|||||||
@@ -1,362 +0,0 @@
|
|||||||
<?php
|
|
||||||
// Copyright (C) 2010-2024 Combodo SAS
|
|
||||||
//
|
|
||||||
// This file is part of iTop.
|
|
||||||
//
|
|
||||||
// iTop is free software; you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// iTop is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* UserRightsMatrix (User management Module)
|
|
||||||
*
|
|
||||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
|
||||||
* @license http://opensource.org/licenses/AGPL-3.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
class UserRightsMatrixClassGrant extends DBObject
|
|
||||||
{
|
|
||||||
public static function Init()
|
|
||||||
{
|
|
||||||
$aParams = array
|
|
||||||
(
|
|
||||||
"category" => "addon/userrights",
|
|
||||||
"key_type" => "autoincrement",
|
|
||||||
"name_attcode" => "",
|
|
||||||
"state_attcode" => "",
|
|
||||||
"reconc_keys" => array(),
|
|
||||||
"db_table" => "priv_ur_matrixclasses",
|
|
||||||
"db_key_field" => "id",
|
|
||||||
"db_finalclass_field" => "",
|
|
||||||
);
|
|
||||||
MetaModel::Init_Params($aParams);
|
|
||||||
//MetaModel::Init_InheritAttributes();
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("userid", array("targetclass"=>"User", "jointype"=> "", "allowed_values"=>null, "sql"=>"userid", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeExternalField("login", array("allowed_values"=>null, "extkey_attcode"=> 'userid', "target_attcode"=>"login")));
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeString("class", array("allowed_values"=>null, "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
|
||||||
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeString("action", array("allowed_values"=>null, "sql"=>"action", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"permission", "default_value"=>"yes", "is_null_allowed"=>false, "depends_on"=>array())));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class UserRightsMatrixClassStimulusGrant extends DBObject
|
|
||||||
{
|
|
||||||
public static function Init()
|
|
||||||
{
|
|
||||||
$aParams = array
|
|
||||||
(
|
|
||||||
"category" => "addon/userrights",
|
|
||||||
"key_type" => "autoincrement",
|
|
||||||
"name_attcode" => "",
|
|
||||||
"state_attcode" => "",
|
|
||||||
"reconc_keys" => array(),
|
|
||||||
"db_table" => "priv_ur_matrixclassesstimulus",
|
|
||||||
"db_key_field" => "id",
|
|
||||||
"db_finalclass_field" => "",
|
|
||||||
);
|
|
||||||
MetaModel::Init_Params($aParams);
|
|
||||||
//MetaModel::Init_InheritAttributes();
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("userid", array("targetclass"=>"User", "jointype"=> "", "allowed_values"=>null, "sql"=>"userid", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeExternalField("login", array("allowed_values"=>null, "extkey_attcode"=> 'userid', "target_attcode"=>"login")));
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeString("class", array("allowed_values"=>null, "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
|
||||||
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeString("stimulus", array("allowed_values"=>null, "sql"=>"action", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"permission", "default_value"=>"yes", "is_null_allowed"=>false, "depends_on"=>array())));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class UserRightsMatrixAttributeGrant extends DBObject
|
|
||||||
{
|
|
||||||
public static function Init()
|
|
||||||
{
|
|
||||||
$aParams = array
|
|
||||||
(
|
|
||||||
"category" => "addon/userrights",
|
|
||||||
"key_type" => "autoincrement",
|
|
||||||
"name_attcode" => "",
|
|
||||||
"state_attcode" => "",
|
|
||||||
"reconc_keys" => array(),
|
|
||||||
"db_table" => "priv_ur_matrixattributes",
|
|
||||||
"db_key_field" => "id",
|
|
||||||
"db_finalclass_field" => "",
|
|
||||||
);
|
|
||||||
MetaModel::Init_Params($aParams);
|
|
||||||
//MetaModel::Init_InheritAttributes();
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeExternalKey("userid", array("targetclass"=>"User", "jointype"=> "", "allowed_values"=>null, "sql"=>"userid", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeExternalField("login", array("allowed_values"=>null, "extkey_attcode"=> 'userid', "target_attcode"=>"login")));
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeString("class", array("allowed_values"=>null, "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeString("attcode", array("allowed_values"=>null, "sql"=>"attcode", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
|
||||||
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeString("action", array("allowed_values"=>null, "sql"=>"action", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"permission", "default_value"=>"yes", "is_null_allowed"=>false, "depends_on"=>array())));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class UserRightsMatrix extends UserRightsAddOnAPI
|
|
||||||
{
|
|
||||||
static public $m_aActionCodes = array(
|
|
||||||
UR_ACTION_READ => 'read',
|
|
||||||
UR_ACTION_MODIFY => 'modify',
|
|
||||||
UR_ACTION_DELETE => 'delete',
|
|
||||||
UR_ACTION_BULK_READ => 'bulk read',
|
|
||||||
UR_ACTION_BULK_MODIFY => 'bulk modify',
|
|
||||||
UR_ACTION_BULK_DELETE => 'bulk delete',
|
|
||||||
);
|
|
||||||
|
|
||||||
// Installation: create the very first user
|
|
||||||
public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US')
|
|
||||||
{
|
|
||||||
// Maybe we should check that no other user with userid == 0 exists
|
|
||||||
$oUser = new UserLocal();
|
|
||||||
$oUser->Set('login', $sAdminUser);
|
|
||||||
$oUser->Set('password', $sAdminPwd);
|
|
||||||
$oUser->Set('contactid', 1); // one is for root !
|
|
||||||
$oUser->Set('language', $sLanguage); // Language was chosen during the installation
|
|
||||||
|
|
||||||
// Now record the admin user object
|
|
||||||
$iUserId = $oUser->DBInsertNoReload();
|
|
||||||
$this->SetupUser($iUserId, true);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function IsAdministrator($oUser)
|
|
||||||
{
|
|
||||||
return ($oUser->GetKey() == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function IsPortalUser($oUser)
|
|
||||||
{
|
|
||||||
return ($oUser->GetKey() == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated - create a new module !
|
|
||||||
public function Setup()
|
|
||||||
{
|
|
||||||
// Users must be added manually
|
|
||||||
// This procedure will then update the matrix when a new user is found or a new class/attribute appears
|
|
||||||
$oUserSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT User"));
|
|
||||||
while ($oUser = $oUserSet->Fetch())
|
|
||||||
{
|
|
||||||
$this->SetupUser($oUser->GetKey());
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function SetupUser($iUserId, $bNewUser = false)
|
|
||||||
{
|
|
||||||
foreach(array('bizmodel', 'application', 'gui', 'core/cmdb') as $sCategory)
|
|
||||||
{
|
|
||||||
foreach (MetaModel::GetClasses($sCategory) as $sClass)
|
|
||||||
{
|
|
||||||
foreach (self::$m_aActionCodes as $iActionCode => $sAction)
|
|
||||||
{
|
|
||||||
if ($bNewUser)
|
|
||||||
{
|
|
||||||
$bAddCell = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixClassGrant WHERE class = '$sClass' AND action = '$sAction' AND userid = $iUserId"));
|
|
||||||
$bAddCell = ($oSet->Count() < 1);
|
|
||||||
}
|
|
||||||
if ($bAddCell)
|
|
||||||
{
|
|
||||||
// Create a new entry
|
|
||||||
$oMyClassGrant = MetaModel::NewObject("UserRightsMatrixClassGrant");
|
|
||||||
$oMyClassGrant->Set("userid", $iUserId);
|
|
||||||
$oMyClassGrant->Set("class", $sClass);
|
|
||||||
$oMyClassGrant->Set("action", $sAction);
|
|
||||||
$oMyClassGrant->Set("permission", "yes");
|
|
||||||
$iId = $oMyClassGrant->DBInsertNoReload();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach (MetaModel::EnumStimuli($sClass) as $sStimulusCode => $oStimulus)
|
|
||||||
{
|
|
||||||
if ($bNewUser)
|
|
||||||
{
|
|
||||||
$bAddCell = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixClassStimulusGrant WHERE class = '$sClass' AND stimulus = '$sStimulusCode' AND userid = $iUserId"));
|
|
||||||
$bAddCell = ($oSet->Count() < 1);
|
|
||||||
}
|
|
||||||
if ($bAddCell)
|
|
||||||
{
|
|
||||||
// Create a new entry
|
|
||||||
$oMyClassGrant = MetaModel::NewObject("UserRightsMatrixClassStimulusGrant");
|
|
||||||
$oMyClassGrant->Set("userid", $iUserId);
|
|
||||||
$oMyClassGrant->Set("class", $sClass);
|
|
||||||
$oMyClassGrant->Set("stimulus", $sStimulusCode);
|
|
||||||
$oMyClassGrant->Set("permission", "yes");
|
|
||||||
$iId = $oMyClassGrant->DBInsertNoReload();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach (MetaModel::GetAttributesList($sClass) as $sAttCode)
|
|
||||||
{
|
|
||||||
if ($bNewUser)
|
|
||||||
{
|
|
||||||
$bAddCell = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixAttributeGrant WHERE class = '$sClass' AND attcode = '$sAttCode' AND userid = $iUserId"));
|
|
||||||
$bAddCell = ($oSet->Count() < 1);
|
|
||||||
}
|
|
||||||
if ($bAddCell)
|
|
||||||
{
|
|
||||||
foreach (array('read', 'modify') as $sAction)
|
|
||||||
{
|
|
||||||
// Create a new entry
|
|
||||||
$oMyAttGrant = MetaModel::NewObject("UserRightsMatrixAttributeGrant");
|
|
||||||
$oMyAttGrant->Set("userid", $iUserId);
|
|
||||||
$oMyAttGrant->Set("class", $sClass);
|
|
||||||
$oMyAttGrant->Set("attcode", $sAttCode);
|
|
||||||
$oMyAttGrant->Set("action", $sAction);
|
|
||||||
$oMyAttGrant->Set("permission", "yes");
|
|
||||||
$iId = $oMyAttGrant->DBInsertNoReload();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
// Create the "My Bookmarks" menu item (parent_id = 0, rank = 6)
|
|
||||||
if ($bNewUser)
|
|
||||||
{
|
|
||||||
$bAddMenu = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT menuNode WHERE type = 'user' AND parent_id = 0 AND user_id = $iUserId"));
|
|
||||||
$bAddMenu = ($oSet->Count() < 1);
|
|
||||||
}
|
|
||||||
if ($bAddMenu)
|
|
||||||
{
|
|
||||||
$oMenu = MetaModel::NewObject('menuNode');
|
|
||||||
$oMenu->Set('type', 'user');
|
|
||||||
$oMenu->Set('parent_id', 0); // It's a toplevel entry
|
|
||||||
$oMenu->Set('rank', 6); // Located just above the Admin Tools section (=7)
|
|
||||||
$oMenu->Set('name', 'My Bookmarks');
|
|
||||||
$oMenu->Set('label', 'My Favorite Items');
|
|
||||||
$oMenu->Set('hyperlink', 'UI.php');
|
|
||||||
$oMenu->Set('template', '<p></p><p></p><p style="text-align:center; font-family:Georgia, Times, serif; font-size:32px;">My bookmarks</p><p style="text-align:center; font-family:Georgia, Times, serif; font-size:14px;"><i>This section contains my most favorite search results</i></p>');
|
|
||||||
$oMenu->Set('user_id', $iUserId);
|
|
||||||
$oMenu->DBInsert();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function Init()
|
|
||||||
{
|
|
||||||
// Could be loaded in a shared memory (?)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetSelectFilter($oUser, $sClass, $aSettings = array())
|
|
||||||
{
|
|
||||||
$oNullFilter = new DBObjectSearch($sClass);
|
|
||||||
return $oNullFilter;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function IsActionAllowed($oUser, $sClass, $iActionCode, $oInstanceSet = null)
|
|
||||||
{
|
|
||||||
if (!array_key_exists($iActionCode, self::$m_aActionCodes))
|
|
||||||
{
|
|
||||||
return UR_ALLOWED_NO;
|
|
||||||
}
|
|
||||||
$sAction = self::$m_aActionCodes[$iActionCode];
|
|
||||||
|
|
||||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixClassGrant WHERE class = '$sClass' AND action = '$sAction' AND userid = '{$oUser->GetKey()}'"));
|
|
||||||
if ($oSet->Count() < 1)
|
|
||||||
{
|
|
||||||
return UR_ALLOWED_NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
$oGrantRecord = $oSet->Fetch();
|
|
||||||
switch ($oGrantRecord->Get('permission'))
|
|
||||||
{
|
|
||||||
case 'yes':
|
|
||||||
$iRetCode = UR_ALLOWED_YES;
|
|
||||||
break;
|
|
||||||
case 'no':
|
|
||||||
default:
|
|
||||||
$iRetCode = UR_ALLOWED_NO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return $iRetCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function IsActionAllowedOnAttribute($oUser, $sClass, $sAttCode, $iActionCode, $oInstanceSet = null)
|
|
||||||
{
|
|
||||||
if (!array_key_exists($iActionCode, self::$m_aActionCodes))
|
|
||||||
{
|
|
||||||
return UR_ALLOWED_NO;
|
|
||||||
}
|
|
||||||
$sAction = self::$m_aActionCodes[$iActionCode];
|
|
||||||
|
|
||||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixAttributeGrant WHERE class = '$sClass' AND attcode = '$sAttCode' AND action = '$sAction' AND userid = '{$oUser->GetKey()}'"));
|
|
||||||
if ($oSet->Count() < 1)
|
|
||||||
{
|
|
||||||
return UR_ALLOWED_NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
$oGrantRecord = $oSet->Fetch();
|
|
||||||
switch ($oGrantRecord->Get('permission'))
|
|
||||||
{
|
|
||||||
case 'yes':
|
|
||||||
$iRetCode = UR_ALLOWED_YES;
|
|
||||||
break;
|
|
||||||
case 'no':
|
|
||||||
default:
|
|
||||||
$iRetCode = UR_ALLOWED_NO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return $iRetCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function IsStimulusAllowed($oUser, $sClass, $sStimulusCode, $oInstanceSet = null)
|
|
||||||
{
|
|
||||||
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixClassStimulusGrant WHERE class = '$sClass' AND stimulus = '$sStimulusCode' AND userid = '{$oUser->GetKey()}'"));
|
|
||||||
if ($oSet->Count() < 1)
|
|
||||||
{
|
|
||||||
return UR_ALLOWED_NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
$oGrantRecord = $oSet->Fetch();
|
|
||||||
switch ($oGrantRecord->Get('permission'))
|
|
||||||
{
|
|
||||||
case 'yes':
|
|
||||||
$iRetCode = UR_ALLOWED_YES;
|
|
||||||
break;
|
|
||||||
case 'no':
|
|
||||||
default:
|
|
||||||
$iRetCode = UR_ALLOWED_NO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return $iRetCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function FlushPrivileges()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
UserRights::SelectModule('UserRightsMatrix');
|
|
||||||
|
|
||||||
?>
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
<?php
|
|
||||||
// Copyright (C) 2010-2024 Combodo SAS
|
|
||||||
//
|
|
||||||
// This file is part of iTop.
|
|
||||||
//
|
|
||||||
// iTop is free software; you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// iTop is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* UserRightsNull
|
|
||||||
* User management Module - say Yeah! to everything
|
|
||||||
*
|
|
||||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
|
||||||
* @license http://opensource.org/licenses/AGPL-3.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
class UserRightsNull extends UserRightsAddOnAPI
|
|
||||||
{
|
|
||||||
// Installation: create the very first user
|
|
||||||
public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US')
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function IsAdministrator($oUser)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function IsPortalUser($oUser)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function Init()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetSelectFilter($oUser, $sClass, $aSettings = array())
|
|
||||||
{
|
|
||||||
$oNullFilter = new DBObjectSearch($sClass);
|
|
||||||
return $oNullFilter;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function IsActionAllowed($oUser, $sClass, $iActionCode, $oInstanceSet = null)
|
|
||||||
{
|
|
||||||
return UR_ALLOWED_YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function IsStimulusAllowed($oUser, $sClass, $sStimulusCode, $oInstanceSet = null)
|
|
||||||
{
|
|
||||||
return UR_ALLOWED_YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function IsActionAllowedOnAttribute($oUser, $sClass, $sAttCode, $iActionCode, $oInstanceSet = null)
|
|
||||||
{
|
|
||||||
return UR_ALLOWED_YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function FlushPrivileges()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
UserRights::SelectModule('UserRightsNull');
|
|
||||||
|
|
||||||
?>
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,25 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/AjaxPage.php, now loadable using autoloader
|
|
||||||
* @license http://opensource.org/licenses/AGPL-3.0
|
|
||||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
|
||||||
*/
|
|
||||||
|
|
||||||
// cannot notify depreciation for now as this is still load in autoloader
|
|
||||||
//DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/AjaxPage.php, now loadable using autoloader');
|
|
||||||
use Combodo\iTop\Application\WebPage\AjaxPage;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class ajax_page
|
|
||||||
*
|
|
||||||
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to AjaxPage
|
|
||||||
*/
|
|
||||||
class ajax_page extends AjaxPage
|
|
||||||
{
|
|
||||||
function __construct($s_title)
|
|
||||||
{
|
|
||||||
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('ajax_page is deprecated. Please use AjaxPage instead');
|
|
||||||
parent::__construct($s_title);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,72 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extend this class instead of implementing iApplicationUIExtension if you don't need to overload
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package UIExtensibilityAPI
|
||||||
|
* @since 2.7.0
|
||||||
|
*/
|
||||||
|
abstract class AbstractApplicationUIExtension implements iApplicationUIExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function OnDisplayProperties($oObject, \Combodo\iTop\Application\WebPage\WebPage $oPage, $bEditMode = false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function OnDisplayRelations($oObject, \Combodo\iTop\Application\WebPage\WebPage $oPage, $bEditMode = false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function OnFormSubmit($oObject, $sFormPrefix = '')
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function OnFormCancel($sTempId)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function EnumUsedAttributes($oObject)
|
||||||
|
{
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function GetIcon($oObject)
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function GetHilightClass($oObject)
|
||||||
|
{
|
||||||
|
return HILIGHT_CLASS_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function EnumAllowedActions(DBObjectSet $oSet)
|
||||||
|
{
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extend this class instead of iPageUIBlockExtension if you don't need to overload all methods
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package UIBlockExtensibilityAPI
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
abstract class AbstractPageUIBlockExtension implements iPageUIBlockExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function GetBannerBlock()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function GetHeaderBlock()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function GetFooterBlock()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extend this class instead of implementing iPreferencesExtension if you don't need to overload all methods
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package PreferencesExtensibilityAPI
|
||||||
|
* @since 2.7.0
|
||||||
|
*/
|
||||||
|
abstract class AbstractPreferencesExtension implements iPreferencesExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function DisplayPreferences(\Combodo\iTop\Application\WebPage\WebPage $oPage)
|
||||||
|
{
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function ApplyPreferences(\Combodo\iTop\Application\WebPage\WebPage $oPage, $sOperation)
|
||||||
|
{
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inherit from this class to provide messages to be displayed in the "Welcome Popup"
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @since 3.2.0
|
||||||
|
*/
|
||||||
|
abstract class AbstractWelcomePopupExtension implements iWelcomePopupExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function GetIconRelPath(): string
|
||||||
|
{
|
||||||
|
return \Combodo\iTop\Application\Branding::$aLogoPaths[\Combodo\iTop\Application\Branding::ENUM_LOGO_TYPE_MAIN_LOGO_COMPACT]['default'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function GetMessages(): array
|
||||||
|
{
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function AcknowledgeMessage(string $sMessageId): void
|
||||||
|
{
|
||||||
|
// No need to process the acknowledgment notice by default
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,150 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for the various types of custom menus
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package UIExtensibilityAPI
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
abstract class ApplicationPopupMenuItem
|
||||||
|
{
|
||||||
|
/** @ignore */
|
||||||
|
protected $sUID;
|
||||||
|
/** @ignore */
|
||||||
|
protected $sLabel;
|
||||||
|
/** @ignore */
|
||||||
|
protected $sTooltip;
|
||||||
|
/** @ignore */
|
||||||
|
protected $sIconClass;
|
||||||
|
/** @ignore */
|
||||||
|
protected $aCssClasses;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @param string $sUID The unique identifier of this menu in iTop... make sure you pass something unique enough
|
||||||
|
* @param string $sLabel The display label of the menu (must be localized)
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function __construct($sUID, $sLabel)
|
||||||
|
{
|
||||||
|
$this->sUID = $sUID;
|
||||||
|
$this->sLabel = $sLabel;
|
||||||
|
$this->sTooltip = '';
|
||||||
|
$this->sIconClass = '';
|
||||||
|
$this->aCssClasses = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the UID
|
||||||
|
*
|
||||||
|
* @return string The unique identifier
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
public function GetUID()
|
||||||
|
{
|
||||||
|
return $this->sUID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the label
|
||||||
|
*
|
||||||
|
* @return string The label
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
public function GetLabel()
|
||||||
|
{
|
||||||
|
return $this->sLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the CSS classes
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
public function GetCssClasses()
|
||||||
|
{
|
||||||
|
return $this->aCssClasses;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $aCssClasses
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function SetCssClasses($aCssClasses)
|
||||||
|
{
|
||||||
|
$this->aCssClasses = $aCssClasses;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a CSS class to the CSS classes that will be put on the menu item
|
||||||
|
*
|
||||||
|
* @param $sCssClass
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function AddCssClass($sCssClass)
|
||||||
|
{
|
||||||
|
$this->aCssClasses[] = $sCssClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $sTooltip
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
public function SetTooltip($sTooltip)
|
||||||
|
{
|
||||||
|
$this->sTooltip = $sTooltip;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
public function GetTooltip()
|
||||||
|
{
|
||||||
|
return $this->sTooltip;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $sIconClass
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
public function SetIconClass($sIconClass)
|
||||||
|
{
|
||||||
|
$this->sIconClass = $sIconClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
public function GetIconClass()
|
||||||
|
{
|
||||||
|
return $this->sIconClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the components to create a popup menu item in HTML
|
||||||
|
*
|
||||||
|
* @return array A hash array: array('label' => , 'url' => , 'target' => , 'onclick' => )
|
||||||
|
* @ignore
|
||||||
|
*/
|
||||||
|
abstract public function GetMenuItem();
|
||||||
|
|
||||||
|
/** @ignore */
|
||||||
|
public function GetLinkedScripts()
|
||||||
|
{
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
}
|
||||||
13
application/applicationextension/backoffice/JSButtonItem.php
Normal file
13
application/applicationextension/backoffice/JSButtonItem.php
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class for adding an item as a button that runs some JS code
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package UIExtensibilityAPI
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
class JSButtonItem extends JSPopupMenuItem
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class for adding an item into a popup menu that triggers some Javascript code
|
||||||
|
*
|
||||||
|
* Note: This works only in the backoffice, {@see \JSButtonItem} for the end-user portal
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package UIExtensibilityAPI
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
class JSPopupMenuItem extends ApplicationPopupMenuItem
|
||||||
|
{
|
||||||
|
/** @ignore */
|
||||||
|
protected $sJsCode;
|
||||||
|
/** @ignore */
|
||||||
|
protected $sUrl;
|
||||||
|
/** @ignore */
|
||||||
|
protected $aIncludeJSFiles;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class for adding an item that triggers some Javascript code
|
||||||
|
*
|
||||||
|
* @param string $sUID The unique identifier of this menu in iTop... make sure you pass something unique enough
|
||||||
|
* @param string $sLabel The display label of the menu (must be localized)
|
||||||
|
* @param string $sJSCode In case the menu consists in executing some havascript code inside the page, pass it here. If supplied $sURL
|
||||||
|
* ans $sTarget will be ignored
|
||||||
|
* @param array $aIncludeJSFiles An array of file URLs to be included (once) to provide some JS libraries for the page.
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function __construct($sUID, $sLabel, $sJSCode, $aIncludeJSFiles = array())
|
||||||
|
{
|
||||||
|
parent::__construct($sUID, $sLabel);
|
||||||
|
$this->sJsCode = $sJSCode;
|
||||||
|
$this->sUrl = '#';
|
||||||
|
$this->aIncludeJSFiles = $aIncludeJSFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @ignore */
|
||||||
|
public function GetMenuItem()
|
||||||
|
{
|
||||||
|
// Note: the semicolumn is a must here!
|
||||||
|
return array(
|
||||||
|
'label' => $this->GetLabel(),
|
||||||
|
'onclick' => $this->GetJsCode() . '; return false;',
|
||||||
|
'url' => $this->GetUrl(),
|
||||||
|
'css_classes' => $this->GetCssClasses(),
|
||||||
|
'icon_class' => $this->sIconClass,
|
||||||
|
'tooltip' => $this->sTooltip
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @ignore */
|
||||||
|
public function GetLinkedScripts()
|
||||||
|
{
|
||||||
|
return $this->aIncludeJSFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @ignore */
|
||||||
|
public function GetJsCode()
|
||||||
|
{
|
||||||
|
return $this->sJsCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @ignore */
|
||||||
|
public function GetUrl()
|
||||||
|
{
|
||||||
|
return $this->sUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class for adding a separator (horizontal line, not selectable) the output
|
||||||
|
* will automatically reduce several consecutive separators to just one
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package UIExtensibilityAPI
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
class SeparatorPopupMenuItem extends ApplicationPopupMenuItem
|
||||||
|
{
|
||||||
|
static $idx = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct('_separator_' . (self::$idx++), '');
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @ignore */
|
||||||
|
public function GetMenuItem()
|
||||||
|
{
|
||||||
|
return array('label' => '<hr class="menu-separator">', 'url' => '', 'css_classes' => $this->aCssClasses);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class for adding an item as a button that browses to the given URL
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package UIExtensibilityAPI
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
class URLButtonItem extends URLPopupMenuItem
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class for adding an item into a popup menu that browses to the given URL
|
||||||
|
*
|
||||||
|
* Note: This works only in the backoffice, {@see \URLButtonItem} for the end-user portal
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package UIExtensibilityAPI
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
class URLPopupMenuItem extends ApplicationPopupMenuItem
|
||||||
|
{
|
||||||
|
/** @ignore */
|
||||||
|
protected $sUrl;
|
||||||
|
/** @ignore */
|
||||||
|
protected $sTarget;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @param string $sUID The unique identifier of this menu in iTop... make sure you pass something unique enough
|
||||||
|
* @param string $sLabel The display label of the menu (must be localized)
|
||||||
|
* @param string $sUrl If the menu is an hyperlink, provide the absolute hyperlink here
|
||||||
|
* @param string $sTarget In case the menu is an hyperlink and a specific target is needed (_blank for example), pass it here
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function __construct($sUID, $sLabel, $sUrl, $sTarget = '_top')
|
||||||
|
{
|
||||||
|
parent::__construct($sUID, $sLabel);
|
||||||
|
$this->sUrl = $sUrl;
|
||||||
|
$this->sTarget = $sTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @ignore */
|
||||||
|
public function GetMenuItem()
|
||||||
|
{
|
||||||
|
return array('label' => $this->GetLabel(),
|
||||||
|
'url' => $this->GetUrl(),
|
||||||
|
'target' => $this->GetTarget(),
|
||||||
|
'css_classes' => $this->aCssClasses,
|
||||||
|
'icon_class' => $this->sIconClass,
|
||||||
|
'tooltip' => $this->sTooltip
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @ignore */
|
||||||
|
public function GetUrl()
|
||||||
|
{
|
||||||
|
return $this->sUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @ignore */
|
||||||
|
public function GetTarget()
|
||||||
|
{
|
||||||
|
return $this->sTarget;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,173 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to change the behavior of the GUI for some objects.
|
||||||
|
*
|
||||||
|
* All methods are invoked by iTop for a given object. There are basically two usages:
|
||||||
|
*
|
||||||
|
* 1) To tweak the form of an object, you will have to implement a specific behavior within:
|
||||||
|
*
|
||||||
|
* * OnDisplayProperties (bEditMode = true)
|
||||||
|
* * OnFormSubmit
|
||||||
|
* * OnFormCancel
|
||||||
|
*
|
||||||
|
* 2) To tune the display of the object details, you can use:
|
||||||
|
*
|
||||||
|
* * OnDisplayProperties
|
||||||
|
* * OnDisplayRelations
|
||||||
|
* * GetIcon
|
||||||
|
* * GetHilightClass
|
||||||
|
*
|
||||||
|
* Please note that some of the APIs can be called several times for a single page displayed.
|
||||||
|
* Therefore it is not recommended to perform too many operations, such as querying the database.
|
||||||
|
* A recommended pattern is to cache data by the mean of static members.
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package UIExtensibilityAPI
|
||||||
|
*/
|
||||||
|
interface iApplicationUIExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Invoked when an object is being displayed (wiew or edit)
|
||||||
|
*
|
||||||
|
* The method is called right after the main tab has been displayed.
|
||||||
|
* You can add output to the page, either to change the display, or to add a form input
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* <code>
|
||||||
|
* if ($bEditMode)
|
||||||
|
* {
|
||||||
|
* $oPage->p('Age of the captain: <input type="text" name="captain_age"/>');
|
||||||
|
* }
|
||||||
|
* else
|
||||||
|
* {
|
||||||
|
* $oPage->p('Age of the captain: '.$iCaptainAge);
|
||||||
|
* }
|
||||||
|
* </code>
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*
|
||||||
|
*@param \Combodo\iTop\Application\WebPage\WebPage $oPage The output context
|
||||||
|
* @param boolean $bEditMode True if the edition form is being displayed
|
||||||
|
*
|
||||||
|
* @param DBObject $oObject The object being displayed
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function OnDisplayProperties($oObject, \Combodo\iTop\Application\WebPage\WebPage $oPage, $bEditMode = false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when an object is being displayed (wiew or edit)
|
||||||
|
*
|
||||||
|
* The method is called rigth after all the tabs have been displayed
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*
|
||||||
|
*@param \Combodo\iTop\Application\WebPage\WebPage $oPage The output context
|
||||||
|
* @param boolean $bEditMode True if the edition form is being displayed
|
||||||
|
*
|
||||||
|
* @param DBObject $oObject The object being displayed
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function OnDisplayRelations($oObject, \Combodo\iTop\Application\WebPage\WebPage $oPage, $bEditMode = false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when the end-user clicks on Modify from the object edition form
|
||||||
|
*
|
||||||
|
* The method is called after the changes from the standard form have been
|
||||||
|
* taken into account, and before saving the changes into the database.
|
||||||
|
*
|
||||||
|
* @param DBObject $oObject The object being edited
|
||||||
|
* @param string $sFormPrefix Prefix given to the HTML form inputs
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function OnFormSubmit($oObject, $sFormPrefix = '');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when the end-user clicks on Cancel from the object edition form
|
||||||
|
*
|
||||||
|
* Implement here any cleanup. This is necessary when you have injected some
|
||||||
|
* javascript into the edition form, and if that code requires to store temporary data
|
||||||
|
* (this is the case when a file must be uploaded).
|
||||||
|
*
|
||||||
|
* @param string $sTempId Unique temporary identifier made of session_id and transaction_id. It identifies the object in a unique way.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function OnFormCancel($sTempId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Not yet called by the framework!
|
||||||
|
*
|
||||||
|
* Sorry, the verb has been reserved. You must implement it, but it is not called as of now.
|
||||||
|
*
|
||||||
|
* @param DBObject $oObject The object being displayed
|
||||||
|
*
|
||||||
|
* @return string[] desc
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function EnumUsedAttributes($oObject); // Not yet implemented
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Not yet called by the framework!
|
||||||
|
*
|
||||||
|
* Sorry, the verb has been reserved. You must implement it, but it is not called as of now.
|
||||||
|
*
|
||||||
|
* @param DBObject $oObject The object being displayed
|
||||||
|
*
|
||||||
|
* @return string Path of the icon, relative to the modules directory.
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetIcon($oObject); // Not yet implemented
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when the object is displayed alone or within a list
|
||||||
|
*
|
||||||
|
* Returns a value influencing the appearance of the object depending on its
|
||||||
|
* state.
|
||||||
|
*
|
||||||
|
* Possible values are:
|
||||||
|
*
|
||||||
|
* * HILIGHT_CLASS_CRITICAL
|
||||||
|
* * HILIGHT_CLASS_WARNING
|
||||||
|
* * HILIGHT_CLASS_OK
|
||||||
|
* * HILIGHT_CLASS_NONE
|
||||||
|
*
|
||||||
|
* @param DBObject $oObject The object being displayed
|
||||||
|
*
|
||||||
|
* @return integer The value representing the mood of the object
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetHilightClass($oObject);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when building the Actions menu for a single object or a list of objects
|
||||||
|
*
|
||||||
|
* Use this to add items to the Actions menu. You will have to specify a label and an URL.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* <code>
|
||||||
|
* $oObject = $oSet->fetch();
|
||||||
|
* if ($oObject instanceof Sheep)
|
||||||
|
* {
|
||||||
|
* return array('View in my app' => 'http://myserver/view_sheeps?id='.$oObject->Get('name'));
|
||||||
|
* }
|
||||||
|
* else
|
||||||
|
* {
|
||||||
|
* return array();
|
||||||
|
* }
|
||||||
|
* </code>
|
||||||
|
*
|
||||||
|
* See also iPopupMenuExtension for greater flexibility
|
||||||
|
*
|
||||||
|
* @param DBObjectSet $oSet A set of persistent objects (DBObject)
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function EnumAllowedActions(DBObjectSet $oSet);
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to add Dict entries
|
||||||
|
*
|
||||||
|
* @see \iTopWebPage::$a_dict_entries
|
||||||
|
* @api
|
||||||
|
* @package BackofficeUIExtensibilityAPI
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
interface iBackofficeDictEntriesExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
* @see \iTopWebPage::a_dict_entries
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetDictEntries(): array;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to add Dict entries prefixes
|
||||||
|
*
|
||||||
|
* @see \iTopWebPage::$a_dict_entries_prefixes
|
||||||
|
* @api
|
||||||
|
* @package BackofficeUIExtensibilityAPI
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
interface iBackofficeDictEntriesPrefixesExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
* @see \iTopWebPage::a_dict_entries_prefixes
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetDictEntriesPrefixes(): array;
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to add inline script (JS) to the backoffice pages' head.
|
||||||
|
* Will be executed first, BEFORE the DOM interpretation.
|
||||||
|
*
|
||||||
|
* @see \iTopWebPage::$a_early_scripts
|
||||||
|
* @api
|
||||||
|
* @package BackofficeUIExtensibilityAPI
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
interface iBackofficeEarlyScriptExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
* @see \iTopWebPage::$a_early_scripts
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetEarlyScript(): string;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to add inline script (JS) to the backoffice pages that will be executed right when the DOM is ready.
|
||||||
|
*
|
||||||
|
* @see \iTopWebPage::$a_init_scripts
|
||||||
|
* @api
|
||||||
|
* @package BackofficeUIExtensibilityAPI
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
interface iBackofficeInitScriptExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
* @see \iTopWebPage::$a_init_scripts
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetInitScript(): string;
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to add script (JS) files to the backoffice pages
|
||||||
|
*
|
||||||
|
* @see \iTopWebPage::$a_linked_scripts
|
||||||
|
* @api
|
||||||
|
* @package BackofficeUIExtensibilityAPI
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
interface iBackofficeLinkedScriptsExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Each script will be included using this property
|
||||||
|
* @return array An array of absolute URLs to the files to include
|
||||||
|
* @see \iTopWebPage::$a_linked_scripts
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetLinkedScriptsAbsUrls(): array;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to add stylesheets (CSS) to the backoffice pages
|
||||||
|
*
|
||||||
|
* @see \iTopWebPage::$a_linked_stylesheets
|
||||||
|
* @api
|
||||||
|
* @package BackofficeUIExtensibilityAPI
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
interface iBackofficeLinkedStylesheetsExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return array An array of absolute URLs to the files to include
|
||||||
|
* @see \iTopWebPage::$a_linked_stylesheets
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetLinkedStylesheetsAbsUrls(): array;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to add inline script (JS) to the backoffice pages that will be executed slightly AFTER the DOM is ready (just after the init. scripts).
|
||||||
|
*
|
||||||
|
* @see \iTopWebPage::$a_ready_scripts
|
||||||
|
* @api
|
||||||
|
* @package BackofficeUIExtensibilityAPI
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
interface iBackofficeReadyScriptExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
* @see \iTopWebPage::$a_ready_scripts
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetReadyScript(): string;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to add sass file (SCSS) to the backoffice pages.
|
||||||
|
* example: return "css/setup.scss"
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package BackofficeUIExtensibilityAPI
|
||||||
|
* @since 3.3.0
|
||||||
|
*/
|
||||||
|
interface iBackofficeSassExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
* @see \iTopWebPage::$a_styles
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetSass(): string;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to add inline script (JS) to the backoffice pages that will be executed immediately, without waiting for the DOM to be ready.
|
||||||
|
*
|
||||||
|
* @see \iTopWebPage::$a_scripts
|
||||||
|
* @api
|
||||||
|
* @package BackofficeUIExtensibilityAPI
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
interface iBackofficeScriptExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
* @see \iTopWebPage::$a_scripts
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetScript(): string;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to add inline style (CSS) to the backoffice pages' head.
|
||||||
|
*
|
||||||
|
* @see \iTopWebPage::$a_styles
|
||||||
|
* @api
|
||||||
|
* @package BackofficeUIExtensibilityAPI
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
interface iBackofficeStyleExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
* @see \iTopWebPage::$a_styles
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetStyle(): string;
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to register a new field renderer mapping to either:
|
||||||
|
* - Add the rendering of a new attribute type
|
||||||
|
* - Overload the default rendering of an attribute type
|
||||||
|
*
|
||||||
|
* @since 3.1.0 N°6041
|
||||||
|
*
|
||||||
|
* @experimental Form / Field / Renderer should be used in more places in next iTop releases, which may introduce major API changes
|
||||||
|
*/
|
||||||
|
interface iFieldRendererMappingsExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return array {
|
||||||
|
* array: {
|
||||||
|
* field: string,
|
||||||
|
* form_renderer: string,
|
||||||
|
* field_renderer: string
|
||||||
|
* }
|
||||||
|
* } List of field renderer mapping: FQCN field class, FQCN Form Renderer class, FQCN Field Renderer class
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
*
|
||||||
|
* ```php
|
||||||
|
* [
|
||||||
|
* ['field' => 'FQCN\FieldA', 'form_renderer' => 'Combodo\iTop\Renderer\Console\ConsoleFormRenderer', 'field_renderer' => 'FQCN\FieldRendererA'],
|
||||||
|
* ['field' => 'FQCN\FieldB', 'form_renderer' => 'Combodo\iTop\Renderer\Console\ConsoleFormRenderer', 'field_renderer' => 'FQCN\FieldRendererB'],
|
||||||
|
* ['field' => 'FQCN\FieldA', 'form_renderer' => 'Combodo\iTop\Renderer\Bootstrap\BsFormRenderer', 'field_renderer' => 'FQCN\FieldRendererA'],
|
||||||
|
* ['field' => 'FQCN\FieldB', 'form_renderer' => 'Combodo\iTop\Renderer\Bootstrap\BsFormRenderer', 'field_renderer' => 'FQCN\FieldRendererB'],
|
||||||
|
* ]
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
public static function RegisterSupportedFields(): array;
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to add content to any iTopWebPage
|
||||||
|
*
|
||||||
|
* There are 3 places where content can be added:
|
||||||
|
*
|
||||||
|
* * The north pane: (normaly empty/hidden) at the top of the page, spanning the whole
|
||||||
|
* width of the page
|
||||||
|
* * The south pane: (normaly empty/hidden) at the bottom of the page, spanning the whole
|
||||||
|
* width of the page
|
||||||
|
* * The admin banner (two tones gray background) at the left of the global search.
|
||||||
|
* Limited space, use it for short messages
|
||||||
|
*
|
||||||
|
* Each of the methods of this interface is supposed to return the HTML to be inserted at
|
||||||
|
* the specified place and can use the passed iTopWebPage object to add javascript or CSS definitions
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package BackofficeUIExtensibilityAPI
|
||||||
|
* @since 3.0.0
|
||||||
|
*/
|
||||||
|
interface iPageUIBlockExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Add content to the "admin banner"
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @return \Combodo\iTop\Application\UI\Base\iUIBlock|null The Block to add into the page
|
||||||
|
*/
|
||||||
|
public function GetBannerBlock();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add content to the header of the page
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @return \Combodo\iTop\Application\UI\Base\iUIBlock|null The Block to add into the page
|
||||||
|
*/
|
||||||
|
public function GetHeaderBlock();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add content to the footer of the page
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @return \Combodo\iTop\Application\UI\Base\iUIBlock|null The Block to add into the page
|
||||||
|
*/
|
||||||
|
public function GetFooterBlock();
|
||||||
|
}
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* New extension to add menu items in the "popup" menus inside iTop. Provides a greater flexibility than
|
||||||
|
* iApplicationUIExtension::EnumAllowedActions.
|
||||||
|
*
|
||||||
|
* To add some menus into iTop, declare a class that implements this interface, it will be called automatically
|
||||||
|
* by the application, as long as the class definition is included somewhere in the code
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package UIExtensibilityAPI
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
interface iPopupMenuExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Insert an item into the Actions menu of a list
|
||||||
|
*
|
||||||
|
* $param is a DBObjectSet containing the list of objects
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const MENU_OBJLIST_ACTIONS = 1;
|
||||||
|
/**
|
||||||
|
* Insert an item into the Toolkit menu of a list
|
||||||
|
*
|
||||||
|
* $param is a DBObjectSet containing the list of objects
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const MENU_OBJLIST_TOOLKIT = 2;
|
||||||
|
/**
|
||||||
|
* Insert an item into the Actions menu on an object details page
|
||||||
|
*
|
||||||
|
* $param is a DBObject instance: the object currently displayed
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const MENU_OBJDETAILS_ACTIONS = 3;
|
||||||
|
/**
|
||||||
|
* Insert an item into the Dashboard menu
|
||||||
|
*
|
||||||
|
* The dashboad menu is shown on the top right corner when a dashboard
|
||||||
|
* is being displayed.
|
||||||
|
*
|
||||||
|
* $param is a Dashboard instance: the dashboard currently displayed
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const MENU_DASHBOARD_ACTIONS = 4;
|
||||||
|
/**
|
||||||
|
* Insert an item into the User menu (upper right corner)
|
||||||
|
*
|
||||||
|
* $param is null
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const MENU_USER_ACTIONS = 5;
|
||||||
|
/**
|
||||||
|
* Insert an item into the Action menu on an object item in an objects list in the portal
|
||||||
|
*
|
||||||
|
* $param is an array('portal_id' => $sPortalId, 'object' => $oObject) containing the portal id and a DBObject instance (the object on
|
||||||
|
* the current line)
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const PORTAL_OBJLISTITEM_ACTIONS = 7;
|
||||||
|
/**
|
||||||
|
* Insert an item into the Action menu on an object details page in the portal
|
||||||
|
*
|
||||||
|
* $param is an array('portal_id' => $sPortalId, 'object' => $oObject) containing the portal id and a DBObject instance (the object
|
||||||
|
* currently displayed)
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const PORTAL_OBJDETAILS_ACTIONS = 8;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert an item into the Actions menu of a list in the portal
|
||||||
|
* Note: This is not implemented yet !
|
||||||
|
*
|
||||||
|
* $param is an array('portal_id' => $sPortalId, 'object_set' => $oSet) containing DBObjectSet containing the list of objects
|
||||||
|
*
|
||||||
|
* @todo
|
||||||
|
*/
|
||||||
|
const PORTAL_OBJLIST_ACTIONS = 6;
|
||||||
|
/**
|
||||||
|
* Insert an item into the user menu of the portal
|
||||||
|
* Note: This is not implemented yet !
|
||||||
|
*
|
||||||
|
* $param is the portal id
|
||||||
|
*
|
||||||
|
* @todo
|
||||||
|
*/
|
||||||
|
const PORTAL_USER_ACTIONS = 9;
|
||||||
|
/**
|
||||||
|
* Insert an item into the navigation menu of the portal
|
||||||
|
* Note: This is not implemented yet !
|
||||||
|
*
|
||||||
|
* $param is the portal id
|
||||||
|
*
|
||||||
|
* @todo
|
||||||
|
*/
|
||||||
|
const PORTAL_MENU_ACTIONS = 10;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of items to be added to a menu.
|
||||||
|
*
|
||||||
|
* This method is called by the framework for each menu.
|
||||||
|
* The items will be inserted in the menu in the order of the returned array.
|
||||||
|
*
|
||||||
|
* @param int $iMenuId The identifier of the type of menu, as listed by the constants MENU_xxx
|
||||||
|
* @param mixed $param Depends on $iMenuId, see the constants defined above
|
||||||
|
*
|
||||||
|
* @return object[] An array of ApplicationPopupMenuItem or an empty array if no action is to be added to the menu
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public static function EnumItems($iMenuId, $param);
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api
|
||||||
|
* @package PreferencesExtensibilityAPI
|
||||||
|
* @since 2.7.0
|
||||||
|
*/
|
||||||
|
interface iPreferencesExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @api
|
||||||
|
*
|
||||||
|
* @param \Combodo\iTop\Application\WebPage\WebPage $oPage
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function DisplayPreferences(\Combodo\iTop\Application\WebPage\WebPage $oPage);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api
|
||||||
|
*
|
||||||
|
* @param string $sOperation
|
||||||
|
*
|
||||||
|
* @param \Combodo\iTop\Application\WebPage\WebPage $oPage
|
||||||
|
*
|
||||||
|
* @return bool true if the operation has been used
|
||||||
|
*/
|
||||||
|
public function ApplyPreferences(\Combodo\iTop\Application\WebPage\WebPage $oPage, $sOperation);
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface to provide messages to be displayed in the "Welcome Popup"
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @since 3.2.0
|
||||||
|
*/
|
||||||
|
interface iWelcomePopupExtension
|
||||||
|
{
|
||||||
|
// Importance for ordering messages
|
||||||
|
// Just two levels since less important messages have nothing to do in the welcome popup
|
||||||
|
public const ENUM_IMPORTANCE_CRITICAL = 0;
|
||||||
|
public const ENUM_IMPORTANCE_HIGH = 1;
|
||||||
|
public const DEFAULT_IMPORTANCE = self::ENUM_IMPORTANCE_HIGH;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overload this method if you need to display an icon representing the provider (eg. your own company logo, module icon, ...)
|
||||||
|
*
|
||||||
|
* @return string Relative path (from app. root) of the icon representing the provider
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetIconRelPath(): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \Combodo\iTop\Application\WelcomePopup\Message[]
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetMessages(): array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overload this method if the provider needs to do some additional processing after the message ($sMessageId) has been acknowledged by the current user
|
||||||
|
*
|
||||||
|
* @param string $sMessageId
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function AcknowledgeMessage(string $sMessageId): void;
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to add files to the backup
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @since 3.2.0
|
||||||
|
*/
|
||||||
|
interface iBackupExtraFilesExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return string[] Array of relative paths (from app root) for files and directories to be included in the backup
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetExtraFilesRelPaths(): array;
|
||||||
|
}
|
||||||
25
application/applicationextension/iKPILoggerExtension.php
Normal file
25
application/applicationextension/iKPILoggerExtension.php
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* KPI logging extensibility point
|
||||||
|
*
|
||||||
|
* KPI Logger extension
|
||||||
|
*/
|
||||||
|
interface iKPILoggerExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Init the statistics collected
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function InitStats();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new KPI to the stats
|
||||||
|
*
|
||||||
|
* @param \Combodo\iTop\Core\Kpi\KpiLogData $oKpiLogData
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function LogOperation($oKpiLogData);
|
||||||
|
}
|
||||||
16
application/applicationextension/iModuleExtension.php
Normal file
16
application/applicationextension/iModuleExtension.php
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helpers for modules extensibility, with discover performed by the MetaModel.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package Extensibility
|
||||||
|
*/
|
||||||
|
interface iModuleExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function __construct();
|
||||||
|
}
|
||||||
@@ -0,0 +1,159 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Login finite state machine
|
||||||
|
*
|
||||||
|
* Execute the action corresponding to the current login state.
|
||||||
|
*
|
||||||
|
* * 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_CONTINUE is returned then the FSM will proceed to next plugin or to next state
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package LoginExtensibilityAPI
|
||||||
|
* @since 2.7.0
|
||||||
|
*/
|
||||||
|
abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
abstract public function ListSupportedLoginModes();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function LoginAction($sLoginState, &$iErrorCode)
|
||||||
|
{
|
||||||
|
switch ($sLoginState) {
|
||||||
|
case LoginWebPage::LOGIN_STATE_START:
|
||||||
|
return $this->OnStart($iErrorCode);
|
||||||
|
|
||||||
|
case LoginWebPage::LOGIN_STATE_MODE_DETECTION:
|
||||||
|
return $this->OnModeDetection($iErrorCode);
|
||||||
|
|
||||||
|
case LoginWebPage::LOGIN_STATE_READ_CREDENTIALS:
|
||||||
|
return $this->OnReadCredentials($iErrorCode);
|
||||||
|
|
||||||
|
case LoginWebPage::LOGIN_STATE_CHECK_CREDENTIALS:
|
||||||
|
return $this->OnCheckCredentials($iErrorCode);
|
||||||
|
|
||||||
|
case LoginWebPage::LOGIN_STATE_CREDENTIALS_OK:
|
||||||
|
return $this->OnCredentialsOK($iErrorCode);
|
||||||
|
|
||||||
|
case LoginWebPage::LOGIN_STATE_USER_OK:
|
||||||
|
return $this->OnUsersOK($iErrorCode);
|
||||||
|
|
||||||
|
case LoginWebPage::LOGIN_STATE_CONNECTED:
|
||||||
|
return $this->OnConnected($iErrorCode);
|
||||||
|
|
||||||
|
case LoginWebPage::LOGIN_STATE_ERROR:
|
||||||
|
return $this->OnError($iErrorCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialization
|
||||||
|
*
|
||||||
|
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||||
|
*
|
||||||
|
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
protected function OnStart(&$iErrorCode)
|
||||||
|
{
|
||||||
|
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detect login mode explicitly without respecting configured order (legacy mode)
|
||||||
|
* In most case do nothing here
|
||||||
|
*
|
||||||
|
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||||
|
*
|
||||||
|
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
protected function OnModeDetection(&$iErrorCode)
|
||||||
|
{
|
||||||
|
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtain the credentials either if login mode is empty or set to yours.
|
||||||
|
* This step can be called multiple times by the FSM:
|
||||||
|
* for example:
|
||||||
|
* 1 - display login form
|
||||||
|
* 2 - read the values posted by the user (store that in session)
|
||||||
|
*
|
||||||
|
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||||
|
*
|
||||||
|
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
protected function OnReadCredentials(&$iErrorCode)
|
||||||
|
{
|
||||||
|
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Control the validity of the data from the session
|
||||||
|
* Automatic user provisioning can be done here
|
||||||
|
*
|
||||||
|
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||||
|
*
|
||||||
|
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
protected function OnCheckCredentials(&$iErrorCode)
|
||||||
|
{
|
||||||
|
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||||
|
*
|
||||||
|
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
protected function OnCredentialsOK(&$iErrorCode)
|
||||||
|
{
|
||||||
|
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||||
|
*
|
||||||
|
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
protected function OnUsersOK(&$iErrorCode)
|
||||||
|
{
|
||||||
|
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||||
|
*
|
||||||
|
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
protected function OnConnected(&$iErrorCode)
|
||||||
|
{
|
||||||
|
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
||||||
|
*
|
||||||
|
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
protected function OnError(&$iErrorCode)
|
||||||
|
{
|
||||||
|
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
17
application/applicationextension/login/iLoginExtension.php
Normal file
17
application/applicationextension/login/iLoginExtension.php
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api
|
||||||
|
* @package LoginExtensibilityAPI
|
||||||
|
* @since 2.7.0
|
||||||
|
*/
|
||||||
|
interface iLoginExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Return the list of supported login modes for this plugin
|
||||||
|
*
|
||||||
|
* @return array of supported login modes
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function ListSupportedLoginModes();
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api
|
||||||
|
* @package LoginExtensibilityAPI
|
||||||
|
* @since 2.7.0
|
||||||
|
*/
|
||||||
|
interface iLoginFSMExtension extends iLoginExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Execute action for this login state
|
||||||
|
* 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_CONTINUE is returned then the FSM will proceed to next plugin or state
|
||||||
|
*
|
||||||
|
* @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_CONTINUE
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function LoginAction($sLoginState, &$iErrorCode);
|
||||||
|
}
|
||||||
17
application/applicationextension/login/iLoginUIExtension.php
Normal file
17
application/applicationextension/login/iLoginUIExtension.php
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Login page extensibility
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package UIExtensibilityAPI
|
||||||
|
* @since 2.7.0
|
||||||
|
*/
|
||||||
|
interface iLoginUIExtension extends iLoginExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return LoginTwigContext
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetTwigContext();
|
||||||
|
}
|
||||||
15
application/applicationextension/login/iLogoutExtension.php
Normal file
15
application/applicationextension/login/iLogoutExtension.php
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @api
|
||||||
|
* @package LoginExtensibilityAPI
|
||||||
|
* @since 2.7.0
|
||||||
|
*/
|
||||||
|
interface iLogoutExtension extends iLoginExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Execute all actions to log out properly
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function LogoutAction();
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extend this class instead of iPortalUIExtension if you don't need to overload all methods
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package PortalExtensibilityAPI
|
||||||
|
* @since 2.4.0
|
||||||
|
*/
|
||||||
|
abstract class AbstractPortalUIExtension implements iPortalUIExtension
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function GetCSSFiles(\Symfony\Component\DependencyInjection\Container $oContainer)
|
||||||
|
{
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function GetCSSInline(\Symfony\Component\DependencyInjection\Container $oContainer)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function GetJSFiles(\Symfony\Component\DependencyInjection\Container $oContainer)
|
||||||
|
{
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function GetJSInline(\Symfony\Component\DependencyInjection\Container $oContainer)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function GetBodyHTML(\Symfony\Component\DependencyInjection\Container $oContainer)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function GetMainContentHTML(\Symfony\Component\DependencyInjection\Container $oContainer)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function GetNavigationMenuHTML(\Symfony\Component\DependencyInjection\Container $oContainer)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to add content to any enhanced portal page
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package PortalExtensibilityAPI
|
||||||
|
*
|
||||||
|
* @since 2.4.0 interface creation
|
||||||
|
* @since 2.7.0 change method signatures due to Silex to Symfony migration
|
||||||
|
*/
|
||||||
|
interface iPortalUIExtension
|
||||||
|
{
|
||||||
|
const ENUM_PORTAL_EXT_UI_BODY = 'Body';
|
||||||
|
const ENUM_PORTAL_EXT_UI_NAVIGATION_MENU = 'NavigationMenu';
|
||||||
|
const ENUM_PORTAL_EXT_UI_MAIN_CONTENT = 'MainContent';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of CSS file urls
|
||||||
|
*
|
||||||
|
* @param \Symfony\Component\DependencyInjection\Container $oContainer
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetCSSFiles(\Symfony\Component\DependencyInjection\Container $oContainer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns inline (raw) CSS
|
||||||
|
*
|
||||||
|
* @param \Symfony\Component\DependencyInjection\Container $oContainer
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetCSSInline(\Symfony\Component\DependencyInjection\Container $oContainer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of JS file urls
|
||||||
|
*
|
||||||
|
* @param \Symfony\Component\DependencyInjection\Container $oContainer
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetJSFiles(\Symfony\Component\DependencyInjection\Container $oContainer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns raw JS code
|
||||||
|
*
|
||||||
|
* @param \Symfony\Component\DependencyInjection\Container $oContainer
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetJSInline(\Symfony\Component\DependencyInjection\Container $oContainer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns raw HTML code to put at the end of the <body> tag
|
||||||
|
*
|
||||||
|
* @param \Symfony\Component\DependencyInjection\Container $oContainer
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetBodyHTML(\Symfony\Component\DependencyInjection\Container $oContainer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns raw HTML code to put at the end of the #main-wrapper element
|
||||||
|
*
|
||||||
|
* @param \Symfony\Component\DependencyInjection\Container $oContainer
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetMainContentHTML(\Symfony\Component\DependencyInjection\Container $oContainer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns raw HTML code to put at the end of the #topbar and #sidebar elements
|
||||||
|
*
|
||||||
|
* @param \Symfony\Component\DependencyInjection\Container $oContainer
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function GetNavigationMenuHTML(\Symfony\Component\DependencyInjection\Container $oContainer);
|
||||||
|
}
|
||||||
102
application/applicationextension/rest/RestResult.php
Normal file
102
application/applicationextension/rest/RestResult.php
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimal REST response structure. Derive this structure to add response data and error codes.
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package RESTAPI
|
||||||
|
* @since 2.0.1
|
||||||
|
*/
|
||||||
|
class RestResult
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Result: no issue has been encountered
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const OK = 0;
|
||||||
|
/**
|
||||||
|
* Result: missing/wrong credentials or the user does not have enough rights to perform the requested operation
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const UNAUTHORIZED = 1;
|
||||||
|
/**
|
||||||
|
* Result: the parameter 'version' is missing
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const MISSING_VERSION = 2;
|
||||||
|
/**
|
||||||
|
* Result: the parameter 'json_data' is missing
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const MISSING_JSON = 3;
|
||||||
|
/**
|
||||||
|
* Result: the input structure is not a valid JSON string
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const INVALID_JSON = 4;
|
||||||
|
/**
|
||||||
|
* Result: the parameter 'auth_user' is missing, authentication aborted
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const MISSING_AUTH_USER = 5;
|
||||||
|
/**
|
||||||
|
* Result: the parameter 'auth_pwd' is missing, authentication aborted
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const MISSING_AUTH_PWD = 6;
|
||||||
|
/**
|
||||||
|
* Result: no operation is available for the specified version
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const UNSUPPORTED_VERSION = 10;
|
||||||
|
/**
|
||||||
|
* Result: the requested operation is not valid for the specified version
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const UNKNOWN_OPERATION = 11;
|
||||||
|
/**
|
||||||
|
* Result: the requested operation cannot be performed because it can cause data (integrity) loss
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const UNSAFE = 12;
|
||||||
|
/**
|
||||||
|
* Result: the request page number is not valid. It must be an integer greater than 0
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const INVALID_PAGE = 13;
|
||||||
|
/**
|
||||||
|
* Result: the operation could not be performed, see the message for troubleshooting
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
const INTERNAL_ERROR = 100;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor - ok!
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->code = RestResult::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result code
|
||||||
|
* @var int
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public $code;
|
||||||
|
/**
|
||||||
|
* Result message
|
||||||
|
* @var string
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public $message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sanitize the content of this result to hide sensitive information
|
||||||
|
*/
|
||||||
|
public function SanitizeContent()
|
||||||
|
{
|
||||||
|
// The default implementation does nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
368
application/applicationextension/rest/RestUtils.php
Normal file
368
application/applicationextension/rest/RestUtils.php
Normal file
@@ -0,0 +1,368 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helpers for implementing REST services
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package RESTAPI
|
||||||
|
*/
|
||||||
|
class RestUtils
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Registering tracking information. Any further object modification be associated with the given comment, when the modification gets
|
||||||
|
* recorded into the DB
|
||||||
|
*
|
||||||
|
* @param StdClass $oData Structured input data. Must contain 'comment'.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @throws Exception
|
||||||
|
* @api
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static function InitTrackingComment($oData)
|
||||||
|
{
|
||||||
|
$sComment = self::GetMandatoryParam($oData, 'comment');
|
||||||
|
CMDBObject::SetTrackInfo($sComment);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read a mandatory parameter from from a Rest/Json structure.
|
||||||
|
*
|
||||||
|
* @param string $sParamName Name of the parameter to fetch from the input data
|
||||||
|
* @param StdClass $oData Structured input data. Must contain the entry defined by sParamName.
|
||||||
|
*
|
||||||
|
* @return mixed parameter value if present
|
||||||
|
* @throws Exception If the parameter is missing
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public static function GetMandatoryParam($oData, $sParamName)
|
||||||
|
{
|
||||||
|
if (isset($oData->$sParamName)) {
|
||||||
|
return $oData->$sParamName;
|
||||||
|
} else {
|
||||||
|
throw new Exception("Missing parameter '$sParamName'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read an optional parameter from a Rest/Json structure.
|
||||||
|
*
|
||||||
|
* @param string $sParamName Name of the parameter to fetch from the input data
|
||||||
|
* @param mixed $default Default value if the parameter is not found in the input data
|
||||||
|
*
|
||||||
|
* @param StdClass $oData Structured input data.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
* @throws Exception
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public static function GetOptionalParam($oData, $sParamName, $default)
|
||||||
|
{
|
||||||
|
if (isset($oData->$sParamName)) {
|
||||||
|
return $oData->$sParamName;
|
||||||
|
} else {
|
||||||
|
return $default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read a class from a Rest/Json structure.
|
||||||
|
*
|
||||||
|
* @param string $sParamName Name of the parameter to fetch from the input data
|
||||||
|
* @param StdClass $oData Structured input data. Must contain the entry defined by sParamName.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @throws Exception If the parameter is missing or the class is unknown
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public static function GetClass($oData, $sParamName)
|
||||||
|
{
|
||||||
|
$sClass = self::GetMandatoryParam($oData, $sParamName);
|
||||||
|
if (!MetaModel::IsValidClass($sClass)) {
|
||||||
|
throw new Exception("$sParamName: '$sClass' is not a valid class'");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read a list of attribute codes from a Rest/Json structure.
|
||||||
|
*
|
||||||
|
* @param StdClass $oData Structured input data.
|
||||||
|
* @param string $sParamName Name of the parameter to fetch from the input data
|
||||||
|
*
|
||||||
|
* @param string $sClass Name of the class
|
||||||
|
*
|
||||||
|
* @return array of class => list of attributes (see RestResultWithObjects::AddObject that uses it)
|
||||||
|
* @throws Exception
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public static function GetFieldList($sClass, $oData, $sParamName)
|
||||||
|
{
|
||||||
|
$sFields = self::GetOptionalParam($oData, $sParamName, '*');
|
||||||
|
$aShowFields = array();
|
||||||
|
if ($sFields == '*') {
|
||||||
|
foreach (MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef) {
|
||||||
|
$aShowFields[$sClass][] = $sAttCode;
|
||||||
|
}
|
||||||
|
} elseif ($sFields == '*+') {
|
||||||
|
foreach (MetaModel::EnumChildClasses($sClass, ENUM_CHILD_CLASSES_ALL) as $sRefClass) {
|
||||||
|
foreach (MetaModel::ListAttributeDefs($sRefClass) as $sAttCode => $oAttDef) {
|
||||||
|
$aShowFields[$sRefClass][] = $sAttCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
foreach (explode(',', $sFields) as $sAttCode) {
|
||||||
|
$sAttCode = trim($sAttCode);
|
||||||
|
if (($sAttCode != 'id') && (!MetaModel::IsValidAttCode($sClass, $sAttCode))) {
|
||||||
|
throw new Exception("$sParamName: invalid attribute code '$sAttCode'");
|
||||||
|
}
|
||||||
|
$aShowFields[$sClass][] = $sAttCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $aShowFields;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read and interpret object search criteria from a Rest/Json structure
|
||||||
|
*
|
||||||
|
* @param string $sClass Name of the class
|
||||||
|
* @param StdClass $oCriteria Hash of attribute code => value (can be a substructure or a scalar, depending on the nature of the
|
||||||
|
* attriute)
|
||||||
|
*
|
||||||
|
* @return object The object found
|
||||||
|
* @throws Exception If the input structure is not valid or it could not find exactly one object
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
protected static function FindObjectFromCriteria($sClass, $oCriteria)
|
||||||
|
{
|
||||||
|
$aCriteriaReport = array();
|
||||||
|
if (isset($oCriteria->finalclass)) {
|
||||||
|
if (!MetaModel::IsValidClass($oCriteria->finalclass)) {
|
||||||
|
throw new Exception("finalclass: Unknown class '" . $oCriteria->finalclass . "'");
|
||||||
|
}
|
||||||
|
if (!MetaModel::IsParentClass($sClass, $oCriteria->finalclass)) {
|
||||||
|
throw new Exception("finalclass: '" . $oCriteria->finalclass . "' is not a child class of '$sClass'");
|
||||||
|
}
|
||||||
|
$sClass = $oCriteria->finalclass;
|
||||||
|
}
|
||||||
|
$oSearch = new DBObjectSearch($sClass);
|
||||||
|
foreach ($oCriteria as $sAttCode => $value) {
|
||||||
|
$realValue = static::MakeValue($sClass, $sAttCode, $value);
|
||||||
|
$oSearch->AddCondition($sAttCode, $realValue, '=');
|
||||||
|
if (is_object($value) || is_array($value)) {
|
||||||
|
$value = json_encode($value);
|
||||||
|
}
|
||||||
|
$aCriteriaReport[] = "$sAttCode: $value ($realValue)";
|
||||||
|
}
|
||||||
|
$oSet = new DBObjectSet($oSearch);
|
||||||
|
$iCount = $oSet->Count();
|
||||||
|
if ($iCount == 0) {
|
||||||
|
throw new Exception("No item found with criteria: " . implode(', ', $aCriteriaReport));
|
||||||
|
} elseif ($iCount > 1) {
|
||||||
|
throw new Exception("Several items found ($iCount) with criteria: " . implode(', ', $aCriteriaReport));
|
||||||
|
}
|
||||||
|
$res = $oSet->Fetch();
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find an object from a polymorph search specification (Rest/Json)
|
||||||
|
*
|
||||||
|
* @param mixed $key Either search criteria (substructure), or an object or an OQL string.
|
||||||
|
* @param bool $bAllowNullValue Allow the cases such as key = 0 or key = {null} and return null then
|
||||||
|
* @param string $sClass Name of the class
|
||||||
|
*
|
||||||
|
* @return DBObject The object found
|
||||||
|
* @throws Exception If the input structure is not valid or it could not find exactly one object
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @see DBObject::CheckChangedExtKeysValues() generic method to check that we can access the linked object isn't used in that use case because values can be literal, OQL, friendlyname
|
||||||
|
*/
|
||||||
|
public static function FindObjectFromKey($sClass, $key, $bAllowNullValue = false)
|
||||||
|
{
|
||||||
|
if (is_object($key)) {
|
||||||
|
$res = static::FindObjectFromCriteria($sClass, $key);
|
||||||
|
} elseif (is_numeric($key)) {
|
||||||
|
if ($bAllowNullValue && ($key == 0)) {
|
||||||
|
$res = null;
|
||||||
|
} else {
|
||||||
|
$res = MetaModel::GetObject($sClass, $key, false);
|
||||||
|
if (is_null($res)) {
|
||||||
|
throw new Exception("Invalid object $sClass::$key");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} elseif (is_string($key)) {
|
||||||
|
// OQL
|
||||||
|
$oSearch = DBObjectSearch::FromOQL($key);
|
||||||
|
$oSet = new DBObjectSet($oSearch);
|
||||||
|
$iCount = $oSet->Count();
|
||||||
|
if ($iCount == 0) {
|
||||||
|
throw new Exception("No item found for query: $key");
|
||||||
|
} elseif ($iCount > 1) {
|
||||||
|
throw new Exception("Several items found ($iCount) for query: $key");
|
||||||
|
}
|
||||||
|
$res = $oSet->Fetch();
|
||||||
|
} else {
|
||||||
|
throw new Exception("Wrong format for key");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search objects from a polymorph search specification (Rest/Json)
|
||||||
|
*
|
||||||
|
* @param string $sClass Name of the class
|
||||||
|
* @param mixed $key Either search criteria (substructure), or an object or an OQL string.
|
||||||
|
* @param int $iLimit The limit of results to return
|
||||||
|
* @param int $iOffset The offset of results to return
|
||||||
|
*
|
||||||
|
* @return DBObjectSet The search result set
|
||||||
|
* @throws Exception If the input structure is not valid
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public static function GetObjectSetFromKey($sClass, $key, $iLimit = 0, $iOffset = 0)
|
||||||
|
{
|
||||||
|
if (is_object($key)) {
|
||||||
|
if (isset($key->finalclass)) {
|
||||||
|
$sClass = $key->finalclass;
|
||||||
|
if (!MetaModel::IsValidClass($sClass)) {
|
||||||
|
throw new Exception("finalclass: Unknown class '$sClass'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$oSearch = new DBObjectSearch($sClass);
|
||||||
|
foreach ($key as $sAttCode => $value) {
|
||||||
|
$realValue = static::MakeValue($sClass, $sAttCode, $value);
|
||||||
|
$oSearch->AddCondition($sAttCode, $realValue, '=');
|
||||||
|
}
|
||||||
|
} elseif (is_numeric($key)) {
|
||||||
|
$oSearch = new DBObjectSearch($sClass);
|
||||||
|
$oSearch->AddCondition('id', $key);
|
||||||
|
} elseif (is_string($key)) {
|
||||||
|
// OQL
|
||||||
|
try {
|
||||||
|
$oSearch = DBObjectSearch::FromOQL($key);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
throw new CoreOqlException('Query failed to execute', [
|
||||||
|
'query' => $key,
|
||||||
|
'exception_class' => get_class($e),
|
||||||
|
'exception_message' => $e->getMessage(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new Exception("Wrong format for key");
|
||||||
|
}
|
||||||
|
$oObjectSet = new DBObjectSet($oSearch, array(), array(), null, $iLimit, $iOffset);
|
||||||
|
|
||||||
|
return $oObjectSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interpret the Rest/Json value and get a valid attribute value
|
||||||
|
*
|
||||||
|
* @param string $sAttCode Attribute code
|
||||||
|
* @param mixed $value Depending on the type of attribute (a scalar, or search criteria, or list of related objects...)
|
||||||
|
* @param string $sClass Name of the class
|
||||||
|
*
|
||||||
|
* @return mixed The value that can be used with DBObject::Set()
|
||||||
|
* @throws Exception If the specification of the value is not valid.
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public static function MakeValue($sClass, $sAttCode, $value)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
if (!MetaModel::IsValidAttCode($sClass, $sAttCode)) {
|
||||||
|
throw new Exception("Unknown attribute");
|
||||||
|
}
|
||||||
|
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
|
||||||
|
if ($oAttDef instanceof AttributeExternalKey) {
|
||||||
|
$oExtKeyObject = static::FindObjectFromKey($oAttDef->GetTargetClass(), $value, true /* allow null */);
|
||||||
|
$value = ($oExtKeyObject != null) ? $oExtKeyObject->GetKey() : 0;
|
||||||
|
} elseif ($oAttDef instanceof AttributeLinkedSet) {
|
||||||
|
if (!is_array($value)) {
|
||||||
|
throw new Exception("A link set must be defined by an array of objects");
|
||||||
|
}
|
||||||
|
$sLnkClass = $oAttDef->GetLinkedClass();
|
||||||
|
$aLinks = array();
|
||||||
|
foreach ($value as $oValues) {
|
||||||
|
$oLnk = static::MakeObjectFromFields($sLnkClass, $oValues);
|
||||||
|
// Fix for N°1939
|
||||||
|
if (($oAttDef instanceof AttributeLinkedSetIndirect) && ($oLnk->Get($oAttDef->GetExtKeyToRemote()) == 0)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$aLinks[] = $oLnk;
|
||||||
|
}
|
||||||
|
$value = DBObjectSet::FromArray($sLnkClass, $aLinks);
|
||||||
|
} elseif ($oAttDef instanceof AttributeTagSet) {
|
||||||
|
if (!is_array($value)) {
|
||||||
|
throw new Exception("A tag set must be defined by an array of tag codes");
|
||||||
|
}
|
||||||
|
$value = $oAttDef->FromJSONToValue($value);
|
||||||
|
} else {
|
||||||
|
$value = $oAttDef->FromJSONToValue($value);
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
throw new Exception("$sAttCode: " . $e->getMessage(), $e->getCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interpret a Rest/Json structure that defines attribute values, and build an object
|
||||||
|
*
|
||||||
|
* @param array $aFields A hash of attribute code => value specification.
|
||||||
|
* @param string $sClass Name of the class
|
||||||
|
*
|
||||||
|
* @return DBObject The newly created object
|
||||||
|
* @throws Exception If the specification of the values is not valid
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public static function MakeObjectFromFields($sClass, $aFields)
|
||||||
|
{
|
||||||
|
$oObject = MetaModel::NewObject($sClass);
|
||||||
|
foreach ($aFields as $sAttCode => $value) {
|
||||||
|
$realValue = static::MakeValue($sClass, $sAttCode, $value);
|
||||||
|
try {
|
||||||
|
$oObject->Set($sAttCode, $realValue);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
throw new Exception("$sAttCode: " . $e->getMessage(), $e->getCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $oObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interpret a Rest/Json structure that defines attribute values, and update the given object
|
||||||
|
*
|
||||||
|
* @param array $aFields A hash of attribute code => value specification.
|
||||||
|
* @param DBObject $oObject The object being modified
|
||||||
|
*
|
||||||
|
* @return DBObject The object modified
|
||||||
|
* @throws Exception If the specification of the values is not valid
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public static function UpdateObjectFromFields($oObject, $aFields)
|
||||||
|
{
|
||||||
|
$sClass = get_class($oObject);
|
||||||
|
foreach ($aFields as $sAttCode => $value) {
|
||||||
|
$realValue = static::MakeValue($sClass, $sAttCode, $value);
|
||||||
|
try {
|
||||||
|
$oObject->Set($sAttCode, $realValue);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
throw new Exception("$sAttCode: " . $e->getMessage(), $e->getCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $oObject;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A REST service provider implementing this interface will have its input JSON data sanitized for logging purposes
|
||||||
|
*
|
||||||
|
* @see \iRestServiceProvider
|
||||||
|
* @since 2.7.13, 3.2.1-1
|
||||||
|
*/
|
||||||
|
interface iRestInputSanitizer
|
||||||
|
{
|
||||||
|
public function SanitizeJsonInput(string $sJsonInput): string;
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement this interface to add new operations to the REST/JSON web service
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
* @package RESTExtensibilityAPI
|
||||||
|
* @since 2.0.1
|
||||||
|
*/
|
||||||
|
interface iRestServiceProvider
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Enumerate services delivered by this class
|
||||||
|
*
|
||||||
|
* @param string $sVersion The version (e.g. 1.0) supported by the services
|
||||||
|
*
|
||||||
|
* @return array An array of hash 'verb' => verb, 'description' => description
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function ListOperations($sVersion);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enumerate services delivered by this class
|
||||||
|
*
|
||||||
|
* @param string $sVersion The version (e.g. 1.0) supported by the services
|
||||||
|
* @param string $sVerb
|
||||||
|
* @param array $aParams
|
||||||
|
*
|
||||||
|
* @return RestResult The standardized result structure (at least a message)
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function ExecOperation($sVersion, $sVerb, $aParams);
|
||||||
|
}
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/CaptureWebPage.php, now loadable using autoloader
|
|
||||||
* @license http://opensource.org/licenses/AGPL-3.0
|
|
||||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
|
||||||
*/
|
|
||||||
|
|
||||||
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/CaptureWebPage.php, now loadable using autoloader');
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/CLIPage.php, now loadable using autoloader
|
|
||||||
* @license http://opensource.org/licenses/AGPL-3.0
|
|
||||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
|
||||||
*/
|
|
||||||
|
|
||||||
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/CLIPage.php, now loadable using autoloader');
|
|
||||||
@@ -214,6 +214,15 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay
|
|||||||
*/
|
*/
|
||||||
protected static bool $bBlockEventDBLinksChanged = false;
|
protected static bool $bBlockEventDBLinksChanged = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If set to true, the object is considered as modified, whatever the actual state is.
|
||||||
|
* This is used when an object is modified indirectly (eg. through a linked set)
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*
|
||||||
|
* @since 3.3.0 N°8210 - Remove iApplicationObjectExtension
|
||||||
|
*/
|
||||||
|
private bool $bIsMarkedAsModified = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor from a row of data (as a hash 'attcode' => value)
|
* Constructor from a row of data (as a hash 'attcode' => value)
|
||||||
@@ -698,10 +707,10 @@ HTML
|
|||||||
$sLinkedClass = $oAttDef->GetLinkedClass();
|
$sLinkedClass = $oAttDef->GetLinkedClass();
|
||||||
|
|
||||||
// Filter out links pointing to obsolete objects (if relevant)
|
// Filter out links pointing to obsolete objects (if relevant)
|
||||||
$oOrmLinkSet = $this->Get($sAttCode);
|
$oOrmLinkSet = $this->Get($sAttCode);
|
||||||
$oLinkSet = $oOrmLinkSet->ToDBObjectSet(utils::ShowObsoleteData());
|
$oLinkSet = $oOrmLinkSet->ToDBObjectSet(utils::ShowObsoleteData());
|
||||||
|
$iCount = $oLinkSet->Count();
|
||||||
|
|
||||||
$iCount = $oLinkSet->Count();
|
|
||||||
if ($this->IsNew()) {
|
if ($this->IsNew()) {
|
||||||
$iFlags = $this->GetInitialStateAttributeFlags($sAttCode);
|
$iFlags = $this->GetInitialStateAttributeFlags($sAttCode);
|
||||||
} else {
|
} else {
|
||||||
@@ -766,9 +775,9 @@ HTML
|
|||||||
$oPage->add($sHTMLValue);
|
$oPage->add($sHTMLValue);
|
||||||
} else {
|
} else {
|
||||||
if ($oAttDef->IsIndirect()) {
|
if ($oAttDef->IsIndirect()) {
|
||||||
$oBlockLinkSetViewTable = new BlockIndirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly);
|
$oBlockLinkSetViewTable = new BlockIndirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly, $iCount);
|
||||||
} else {
|
} else {
|
||||||
$oBlockLinkSetViewTable = new BlockDirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly);
|
$oBlockLinkSetViewTable = new BlockDirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly, $iCount);
|
||||||
}
|
}
|
||||||
$oPage->AddUiBlock($oBlockLinkSetViewTable);
|
$oPage->AddUiBlock($oBlockLinkSetViewTable);
|
||||||
}
|
}
|
||||||
@@ -805,16 +814,16 @@ HTML
|
|||||||
if (!$this->IsNew()) {
|
if (!$this->IsNew()) {
|
||||||
// Look for any trigger that considers this object as "In Scope"
|
// Look for any trigger that considers this object as "In Scope"
|
||||||
// If any trigger has been found then display a tab with notifications
|
// 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();
|
$aTriggers = $this->GetRelatedTriggersIDs();
|
||||||
if (count($aTriggers) > 0) {
|
if (count($aTriggers) > 0) {
|
||||||
$iId = $this->GetKey();
|
$iId = $this->GetKey();
|
||||||
$aParams = array('triggers' => $aTriggers, 'id' => $iId);
|
$aParams = array('class' => get_class($this), 'id' => $iId);
|
||||||
$aNotifSearches = array();
|
$aNotifSearches = array();
|
||||||
$iNotifsCount = 0;
|
$iNotifsCount = 0;
|
||||||
$aNotificationClasses = MetaModel::EnumChildClasses('EventNotification');
|
$aNotificationClasses = MetaModel::EnumChildClasses('EventNotification');
|
||||||
foreach ($aNotificationClasses as $sNotifClass) {
|
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);
|
$aNotifSearches[$sNotifClass]->SetInternalParams($aParams);
|
||||||
$oNotifSet = new DBObjectSet($aNotifSearches[$sNotifClass], array());
|
$oNotifSet = new DBObjectSet($aNotifSearches[$sNotifClass], array());
|
||||||
$iNotifsCount += $oNotifSet->Count();
|
$iNotifsCount += $oNotifSet->Count();
|
||||||
@@ -1209,35 +1218,6 @@ HTML
|
|||||||
return DataTableUIBlockFactory::MakeForObject($oPage, $sTableId, $oSet, $aExtraParams);
|
return DataTableUIBlockFactory::MakeForObject($oPage, $sTableId, $oSet, $aExtraParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the HTML fragment corresponding to the display of a table representing a set of objects
|
|
||||||
*
|
|
||||||
* @param WebPage $oPage The page object is used for out-of-band information (mostly scripts) output
|
|
||||||
* @param \DBObjectSet $oSet The set of objects to display
|
|
||||||
* @param array $aExtraParams key used :
|
|
||||||
* <ul>
|
|
||||||
* <li>view_link : if true then for extkey will display links with friendly name and make column sortable, default true
|
|
||||||
* <li>menu : if true prints DisplayBlock menu, default true
|
|
||||||
* <li>display_aliases : list of query aliases that will be printed, defaults to [] (displays all)
|
|
||||||
* <li>zlist : name of the zlist to use, false to disable zlist lookup, default to 'list'
|
|
||||||
* <li>extra_fields : list of <alias>.<attcode> to add to the result, separator ',', defaults to empty string
|
|
||||||
* </ul>
|
|
||||||
*
|
|
||||||
* @return String The HTML fragment representing the table of objects. <b>Warning</b> : no JS added to handled
|
|
||||||
* pagination or table sorting !
|
|
||||||
*
|
|
||||||
* @see DisplayBlock to get a similar table but with the JS for pagination & sorting
|
|
||||||
*
|
|
||||||
* @deprecated 3.0.0 use GetDisplaySetBlock
|
|
||||||
*/
|
|
||||||
public static function GetDisplaySet(WebPage $oPage, DBObjectSet $oSet, $aExtraParams = array())
|
|
||||||
{
|
|
||||||
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('use GetDisplaySetBlock');
|
|
||||||
$oPage->AddUiBlock(static::GetDisplaySetBlock($oPage, $oSet, $aExtraParams));
|
|
||||||
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param WebPage $oPage
|
* @param WebPage $oPage
|
||||||
* @param \DBObjectSet $oSet
|
* @param \DBObjectSet $oSet
|
||||||
@@ -1411,129 +1391,6 @@ HTML
|
|||||||
//DataTableUIBlockFactory::MakeForStaticData('', $aHeader, $aRows);
|
//DataTableUIBlockFactory::MakeForStaticData('', $aHeader, $aRows);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param WebPage $oPage
|
|
||||||
* @param \CMDBObjectSet $oSet
|
|
||||||
* @param array $aExtraParams key used :
|
|
||||||
* <ul>
|
|
||||||
* <li>view_link : if true then for extkey will display links with friendly name and make column sortable, default true
|
|
||||||
* <li>menu : if true prints DisplayBlock menu, default true
|
|
||||||
* <li>display_aliases : list of query aliases that will be printed, defaults to [] (displays all)
|
|
||||||
* <li>zlist : name of the zlist to use, false to disable zlist lookup, default to 'list'
|
|
||||||
* <li>extra_fields : list of <alias>.<attcode> to add to the result, separator ',', defaults to empty string
|
|
||||||
* </ul>
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @throws \CoreException
|
|
||||||
* @throws \DictExceptionMissingString
|
|
||||||
* @throws \MissingQueryArgument
|
|
||||||
* @throws \MySQLException
|
|
||||||
* @throws \MySQLHasGoneAwayException
|
|
||||||
* @deprecated 3.0.0
|
|
||||||
*/
|
|
||||||
public static function GetDisplayExtendedSet(WebPage $oPage, CMDBObjectSet $oSet, $aExtraParams = array())
|
|
||||||
{
|
|
||||||
DeprecatedCallsLog::NotifyDeprecatedPhpMethod();
|
|
||||||
if (empty($aExtraParams['currentId'])) {
|
|
||||||
$iListId = utils::GetUniqueId(); // Works only if not in an Ajax page !!
|
|
||||||
} else {
|
|
||||||
$iListId = $aExtraParams['currentId'];
|
|
||||||
}
|
|
||||||
$aList = array();
|
|
||||||
|
|
||||||
// Initialize and check the parameters
|
|
||||||
$bViewLink = isset($aExtraParams['view_link']) ? $aExtraParams['view_link'] : true;
|
|
||||||
$bDisplayMenu = isset($aExtraParams['menu']) ? $aExtraParams['menu'] == true : true;
|
|
||||||
// Check if there is a list of aliases to limit the display to...
|
|
||||||
$aDisplayAliases = isset($aExtraParams['display_aliases']) ? explode(',',
|
|
||||||
$aExtraParams['display_aliases']) : array();
|
|
||||||
$sZListName = isset($aExtraParams['zlist']) ? ($aExtraParams['zlist']) : 'list';
|
|
||||||
|
|
||||||
$aExtraFieldsRaw = isset($aExtraParams['extra_fields']) ? explode(',',
|
|
||||||
trim($aExtraParams['extra_fields'])) : array();
|
|
||||||
$aExtraFields = array();
|
|
||||||
$sAttCode = '';
|
|
||||||
foreach($aExtraFieldsRaw as $sFieldName)
|
|
||||||
{
|
|
||||||
// Ignore attributes not of the main queried class
|
|
||||||
if (preg_match('/^(.*)\.(.*)$/', $sFieldName, $aMatches))
|
|
||||||
{
|
|
||||||
$sClassAlias = $aMatches[1];
|
|
||||||
$sAttCode = $aMatches[2];
|
|
||||||
if (array_key_exists($sClassAlias, $oSet->GetSelectedClasses()))
|
|
||||||
{
|
|
||||||
$aExtraFields[$sClassAlias][] = $sAttCode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$aExtraFields['*'] = $sAttCode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$aClasses = $oSet->GetFilter()->GetSelectedClasses();
|
|
||||||
$aAuthorizedClasses = array();
|
|
||||||
foreach($aClasses as $sAlias => $sClassName)
|
|
||||||
{
|
|
||||||
if ((UserRights::IsActionAllowed($sClassName, UR_ACTION_READ, $oSet) != UR_ALLOWED_NO) &&
|
|
||||||
((count($aDisplayAliases) == 0) || (in_array($sAlias, $aDisplayAliases))))
|
|
||||||
{
|
|
||||||
$aAuthorizedClasses[$sAlias] = $sClassName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach($aAuthorizedClasses as $sAlias => $sClassName)
|
|
||||||
{
|
|
||||||
if (array_key_exists($sAlias, $aExtraFields))
|
|
||||||
{
|
|
||||||
$aList[$sAlias] = $aExtraFields[$sAlias];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$aList[$sAlias] = array();
|
|
||||||
}
|
|
||||||
if ($sZListName !== false)
|
|
||||||
{
|
|
||||||
$aDefaultList = self::FlattenZList(MetaModel::GetZListItems($sClassName, $sZListName));
|
|
||||||
|
|
||||||
$aList[$sAlias] = array_merge($aDefaultList, $aList[$sAlias]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Filter the list to removed linked set since we are not able to display them here
|
|
||||||
foreach ($aList[$sAlias] as $index => $sAttCode)
|
|
||||||
{
|
|
||||||
$oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttCode);
|
|
||||||
if ($oAttDef instanceof AttributeLinkedSet)
|
|
||||||
{
|
|
||||||
// Removed from the display list
|
|
||||||
unset($aList[$sAlias][$index]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($aList[$sAlias]))
|
|
||||||
{
|
|
||||||
unset($aList[$sAlias], $aAuthorizedClasses[$sAlias]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$sSelectMode = 'none';
|
|
||||||
|
|
||||||
$oDataTable = new DataTable($iListId, $oSet, $aAuthorizedClasses);
|
|
||||||
|
|
||||||
$oSettings = DataTableSettings::GetDataModelSettings($aAuthorizedClasses, $bViewLink, $aList);
|
|
||||||
|
|
||||||
$bDisplayLimit = isset($aExtraParams['display_limit']) ? $aExtraParams['display_limit'] : true;
|
|
||||||
if ($bDisplayLimit)
|
|
||||||
{
|
|
||||||
$iDefaultPageSize = appUserPreferences::GetPref('default_page_size',
|
|
||||||
MetaModel::GetConfig()->GetMinDisplayLimit());
|
|
||||||
$oSettings->iDefaultPageSize = $iDefaultPageSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
$oSettings->aSortOrder = MetaModel::GetOrderByDefault($sClassName);
|
|
||||||
|
|
||||||
return $oDataTable->Display($oPage, $oSettings, $bDisplayMenu, $sSelectMode, $bViewLink, $aExtraParams);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param WebPage $oPage
|
* @param WebPage $oPage
|
||||||
* @param \CMDBObjectSet $oSet
|
* @param \CMDBObjectSet $oSet
|
||||||
@@ -2223,7 +2080,7 @@ JS
|
|||||||
);
|
);
|
||||||
|
|
||||||
// test query link
|
// test query link
|
||||||
$sTestResId = 'query_res_'.$sFieldPrefix.$sAttCode.$sNameSuffix; //$oPage->GetUniqueId();
|
$sTestResId = 'query_res_'.$sFieldPrefix.$sAttCode.$sNameSuffix;
|
||||||
$sBaseUrl = utils::GetAbsoluteUrlAppRoot().'pages/run_query.php?expression=';
|
$sBaseUrl = utils::GetAbsoluteUrlAppRoot().'pages/run_query.php?expression=';
|
||||||
$sTestQueryLbl = Dict::S('UI:Edit:TestQuery');
|
$sTestQueryLbl = Dict::S('UI:Edit:TestQuery');
|
||||||
$oTestQueryButton = ButtonUIBlockFactory::MakeIconAction(
|
$oTestQueryButton = ButtonUIBlockFactory::MakeIconAction(
|
||||||
@@ -2931,11 +2788,11 @@ JS
|
|||||||
$sStatesSelection .= '</select>';
|
$sStatesSelection .= '</select>';
|
||||||
$sStatesSelection .= '<input type="hidden" id="obj_state_orig" name="obj_state_orig" value="'.$this->GetState().'"/>';
|
$sStatesSelection .= '<input type="hidden" id="obj_state_orig" name="obj_state_orig" value="'.$this->GetState().'"/>';
|
||||||
$oPage->add_ready_script(<<<JS
|
$oPage->add_ready_script(<<<JS
|
||||||
$('.state_select_{$this->m_iFormId}').change( function() {
|
$('.state_select_{$this->m_iFormId}').on('change', function() {
|
||||||
if ($('#obj_state_orig').val() != $(this).val()) {
|
if ($('#obj_state_orig').val() != $(this).val()) {
|
||||||
$('.state_select_{$this->m_iFormId}').val($(this).val());
|
$('.state_select_{$this->m_iFormId}').val($(this).val());
|
||||||
$('#form_{$this->m_iFormId}').data('force_submit', true);
|
$('#form_{$this->m_iFormId}').data('force_submit', true);
|
||||||
$('#form_{$this->m_iFormId}').submit();
|
$('#form_{$this->m_iFormId}').trigger('submit');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
JS
|
JS
|
||||||
@@ -3584,15 +3441,13 @@ EOF
|
|||||||
} else {
|
} else {
|
||||||
//we can directly apply the stimuli
|
//we can directly apply the stimuli
|
||||||
$sExceptionMessage = null;
|
$sExceptionMessage = null;
|
||||||
|
$bApplyStimulus = false;
|
||||||
try {
|
try {
|
||||||
$bApplyStimulus = $this->ApplyStimulus($sStimulus); // will write the object in the DB
|
$bApplyStimulus = $this->ApplyStimulus($sStimulus); // will write the object in the DB
|
||||||
}
|
} catch (Exception $oException) {
|
||||||
catch (Exception $oException) {
|
|
||||||
// Catch any exception happening during the stimulus
|
// Catch any exception happening during the stimulus
|
||||||
$bApplyStimulus = false;
|
|
||||||
$sExceptionMessage = ($oException instanceof CoreCannotSaveObjectException) ? $oException->getHtmlMessage() : $oException->getMessage();
|
$sExceptionMessage = ($oException instanceof CoreCannotSaveObjectException) ? $oException->getHtmlMessage() : $oException->getMessage();
|
||||||
}
|
} finally {
|
||||||
finally {
|
|
||||||
if ($sOwnershipToken !== null) {
|
if ($sOwnershipToken !== null) {
|
||||||
// Release the concurrent lock, if any
|
// Release the concurrent lock, if any
|
||||||
iTopOwnershipLock::ReleaseLock($sClass, $iKey, $sOwnershipToken);
|
iTopOwnershipLock::ReleaseLock($sClass, $iKey, $sOwnershipToken);
|
||||||
@@ -3600,9 +3455,8 @@ EOF
|
|||||||
if (!$bApplyStimulus) {
|
if (!$bApplyStimulus) {
|
||||||
// Throw an application oriented exception if necessary
|
// Throw an application oriented exception if necessary
|
||||||
throw new ApplicationException($sExceptionMessage ?? Dict::S('UI:FailedToApplyStimuli'));
|
throw new ApplicationException($sExceptionMessage ?? Dict::S('UI:FailedToApplyStimuli'));
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3925,7 +3779,7 @@ HTML;
|
|||||||
public static function GetShortcutActions($sFinalClass)
|
public static function GetShortcutActions($sFinalClass)
|
||||||
{
|
{
|
||||||
$sShortcutActions = MetaModel::GetConfig()->Get('shortcut_actions');
|
$sShortcutActions = MetaModel::GetConfig()->Get('shortcut_actions');
|
||||||
$aShortcutActions = explode(',', $sShortcutActions);
|
$aShortcutActions = array_map('trim', explode(',', $sShortcutActions));
|
||||||
|
|
||||||
return $aShortcutActions;
|
return $aShortcutActions;
|
||||||
}
|
}
|
||||||
@@ -4313,24 +4167,15 @@ HTML;
|
|||||||
|
|
||||||
case 'Image':
|
case 'Image':
|
||||||
$value = null;
|
$value = null;
|
||||||
|
$aDimensions = null;
|
||||||
$oImage = utils::ReadPostedDocument("attr_{$sFormPrefix}{$sAttCode}", 'fcontents');
|
$oImage = utils::ReadPostedDocument("attr_{$sFormPrefix}{$sAttCode}", 'fcontents');
|
||||||
if (!is_null($oImage->GetData()))
|
$oImage = $oImage->ResizeImageToFit(
|
||||||
{
|
$oAttDef->Get('storage_max_width'),
|
||||||
$aSize = utils::GetImageSize($oImage->GetData());
|
$oAttDef->Get('storage_max_height'),
|
||||||
if (is_array($aSize) && $aSize[0] > 0 && $aSize[1] > 0)
|
$aDimensions
|
||||||
{
|
);
|
||||||
$oImage = utils::ResizeImageToFit(
|
if (is_null($aDimensions)) {
|
||||||
$oImage,
|
IssueLog::Warning($sClass . ':' . $this->GetKey() . '/' . $sAttCode . ': Image could not be resized. Mimetype: ' . $oImage->GetMimeType() . ', filename: ' . $oImage->GetFileName());
|
||||||
$aSize[0],
|
|
||||||
$aSize[1],
|
|
||||||
$oAttDef->Get('storage_max_width'),
|
|
||||||
$oAttDef->Get('storage_max_height')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
IssueLog::Warning($sClass . ':' . $this->GetKey() . '/' . $sAttCode . ': Image could not be resized. Mimetype: ' . $oImage->GetMimeType() . ', filename: ' . $oImage->GetFileName());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$aOtherData = utils::ReadPostedParam("attr_{$sFormPrefix}{$sAttCode}", null, 'raw_data');
|
$aOtherData = utils::ReadPostedParam("attr_{$sFormPrefix}{$sAttCode}", null, 'raw_data');
|
||||||
if (is_array($aOtherData))
|
if (is_array($aOtherData))
|
||||||
@@ -4551,21 +4396,6 @@ HTML;
|
|||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function PostInsertActions(): void
|
|
||||||
{
|
|
||||||
parent::PostInsertActions();
|
|
||||||
|
|
||||||
// Invoke extensions after insertion (the object must exist, have an id, etc.)
|
|
||||||
/** @var \iApplicationObjectExtension $oExtensionInstance */
|
|
||||||
foreach (MetaModel::EnumPlugins(iApplicationObjectExtension::class) as $oExtensionInstance) {
|
|
||||||
$sExtensionClass = get_class($oExtensionInstance);
|
|
||||||
$this->LogCRUDDebug(__METHOD__, "Calling $sExtensionClass::OnDBInsert()");
|
|
||||||
$oKPI = new ExecutionKPI();
|
|
||||||
$oExtensionInstance->OnDBInsert($this, self::GetCurrentChange());
|
|
||||||
$oKPI->ComputeStatsForExtension($oExtensionInstance, 'OnDBInsert');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
* Attaches InlineImages to the current object
|
* Attaches InlineImages to the current object
|
||||||
@@ -4575,28 +4405,6 @@ HTML;
|
|||||||
InlineImage::FinalizeInlineImages($this);
|
InlineImage::FinalizeInlineImages($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated 3.1.1 3.2.0 N°6966 We will have only one DBClone method in the future
|
|
||||||
*/
|
|
||||||
protected function DBCloneTracked_Internal($newKey = null)
|
|
||||||
{
|
|
||||||
/** @var cmdbAbstractObject $oNewObj */
|
|
||||||
$oNewObj = MetaModel::GetObject(get_class($this), parent::DBCloneTracked_Internal($newKey));
|
|
||||||
|
|
||||||
// Invoke extensions after insertion (the object must exist, have an id, etc.)
|
|
||||||
/** @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');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $oNewObj;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function DBUpdate()
|
public function DBUpdate()
|
||||||
{
|
{
|
||||||
$this->LogCRUDEnter(__METHOD__);
|
$this->LogCRUDEnter(__METHOD__);
|
||||||
@@ -4620,21 +4428,6 @@ HTML;
|
|||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function PostUpdateActions(array $aChanges): void
|
|
||||||
{
|
|
||||||
parent::PostUpdateActions($aChanges);
|
|
||||||
|
|
||||||
// Invoke extensions after the update (could be before)
|
|
||||||
/** @var \iApplicationObjectExtension $oExtensionInstance */
|
|
||||||
foreach (MetaModel::EnumPlugins(iApplicationObjectExtension::class) as $oExtensionInstance) {
|
|
||||||
$sExtensionClass = get_class($oExtensionInstance);
|
|
||||||
$this->LogCRUDDebug(__METHOD__, "Calling $sExtensionClass::OnDBUpdate()");
|
|
||||||
$oKPI = new ExecutionKPI();
|
|
||||||
$oExtensionInstance->OnDBUpdate($this, self::GetCurrentChange());
|
|
||||||
$oKPI->ComputeStatsForExtension($oExtensionInstance, 'OnDBUpdate');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $sMessageIdPrefix
|
* @param string $sMessageIdPrefix
|
||||||
*
|
*
|
||||||
@@ -4670,45 +4463,11 @@ HTML;
|
|||||||
return $oDeletionPlan;
|
return $oDeletionPlan;
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
final protected function PostDeleteActions(): void
|
||||||
{
|
{
|
||||||
parent::PostDeleteActions();
|
parent::PostDeleteActions();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated 3.1.1 3.2.0 N°6967 We will have only one DBDelete method in the future
|
|
||||||
*/
|
|
||||||
protected function DBDeleteTracked_Internal(&$oDeletionPlan = null)
|
|
||||||
{
|
|
||||||
// Invoke extensions before the deletion (the deletion will do some cleanup and we might loose some information
|
|
||||||
/** @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');
|
|
||||||
}
|
|
||||||
|
|
||||||
return parent::DBDeleteTracked_Internal($oDeletionPlan);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function IsModified()
|
public function IsModified()
|
||||||
{
|
{
|
||||||
if (parent::IsModified())
|
if (parent::IsModified())
|
||||||
@@ -4716,25 +4475,20 @@ HTML;
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Plugins
|
return $this->bIsMarkedAsModified;
|
||||||
//
|
}
|
||||||
/** @var \iApplicationObjectExtension $oExtensionInstance */
|
|
||||||
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');
|
|
||||||
if ($bIsModified) {
|
|
||||||
$this->LogCRUDDebug(__METHOD__, "Calling $sExtensionClass::OnIsModified() -> true");
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
$this->LogCRUDDebug(__METHOD__, "Calling $sExtensionClass::OnIsModified() -> false");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
/**
|
||||||
|
* Override the default modification state of the object.
|
||||||
|
*
|
||||||
|
* The object is considered as modified, whatever the actual state is.
|
||||||
|
* This is used when an object is modified indirectly (eg. through a linked set)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function MarkObjectAsModified(): void
|
||||||
|
{
|
||||||
|
$this->bIsMarkedAsModified = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -4748,7 +4502,7 @@ HTML;
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether to bypass the checks of user rights when writing this object, could be used in {@link \iApplicationObjectExtension::OnCheckToWrite()}
|
* Whether to bypass the checks of user rights when writing this object
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
@@ -4777,22 +4531,6 @@ HTML;
|
|||||||
{
|
{
|
||||||
parent::DoCheckToWrite();
|
parent::DoCheckToWrite();
|
||||||
|
|
||||||
// Plugins
|
|
||||||
//
|
|
||||||
/** @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');
|
|
||||||
if (is_array($aNewIssues) && (count($aNewIssues) > 0)) // Some extensions return null instead of an empty array
|
|
||||||
{
|
|
||||||
$this->m_aCheckIssues = array_merge($this->m_aCheckIssues, $aNewIssues);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// User rights
|
// User rights
|
||||||
//
|
//
|
||||||
if (!$this->bAllowWrite)
|
if (!$this->bAllowWrite)
|
||||||
@@ -4829,22 +4567,6 @@ HTML;
|
|||||||
{
|
{
|
||||||
parent::DoCheckToDelete($oDeletionPlan);
|
parent::DoCheckToDelete($oDeletionPlan);
|
||||||
|
|
||||||
// Plugins
|
|
||||||
//
|
|
||||||
/** @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');
|
|
||||||
if (is_array($aNewIssues) && count($aNewIssues) > 0)
|
|
||||||
{
|
|
||||||
$this->m_aDeleteIssues = array_merge($this->m_aDeleteIssues, $aNewIssues);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// User rights
|
// User rights
|
||||||
//
|
//
|
||||||
if (! $this->bAllowDelete)
|
if (! $this->bAllowDelete)
|
||||||
@@ -4860,110 +4582,6 @@ HTML;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Special display where the case log uses the whole "screen" at the bottom of the "Properties" tab
|
|
||||||
*
|
|
||||||
* @param WebPage $oPage
|
|
||||||
* @param string $sAttCode
|
|
||||||
* @param string $sComment
|
|
||||||
* @param string $sPrefix
|
|
||||||
* @param bool $bEditMode
|
|
||||||
*
|
|
||||||
* @throws \ArchivedObjectException
|
|
||||||
* @throws \CoreException
|
|
||||||
* @throws \CoreUnexpectedValue
|
|
||||||
* @throws \DictExceptionMissingString
|
|
||||||
* @throws \MySQLException
|
|
||||||
* @throws \OQLException
|
|
||||||
* @throws \Exception
|
|
||||||
* @deprecated 3.0.0, will be removed in 3.1.0
|
|
||||||
*/
|
|
||||||
public function DisplayCaseLog(WebPage $oPage, $sAttCode, $sComment = '', $sPrefix = '', $bEditMode = false)
|
|
||||||
{
|
|
||||||
DeprecatedCallsLog::NotifyDeprecatedPhpMethod();
|
|
||||||
$oPage->SetCurrentTab('UI:PropertiesTab');
|
|
||||||
$sClass = get_class($this);
|
|
||||||
|
|
||||||
if ($this->IsNew()) {
|
|
||||||
$iFlags = $this->GetInitialStateAttributeFlags($sAttCode);
|
|
||||||
} else {
|
|
||||||
$iFlags = $this->GetAttributeFlags($sAttCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($iFlags & OPT_ATT_HIDDEN) {
|
|
||||||
// The case log is hidden do nothing
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
|
|
||||||
$sAttDefClass = get_class($oAttDef);
|
|
||||||
$sAttLabel = $oAttDef->GetLabel();
|
|
||||||
$sAttMetaDataLabel = utils::HtmlEntities($sAttLabel);
|
|
||||||
$sAttMetaDataFlagHidden = (($iFlags & OPT_ATT_HIDDEN) === OPT_ATT_HIDDEN) ? 'true' : 'false';
|
|
||||||
$sAttMetaDataFlagReadOnly = (($iFlags & OPT_ATT_READONLY) === OPT_ATT_READONLY) ? 'true' : 'false';
|
|
||||||
$sAttMetaDataFlagMandatory = (($iFlags & OPT_ATT_MANDATORY) === OPT_ATT_MANDATORY) ? 'true' : 'false';
|
|
||||||
$sAttMetaDataFlagMustChange = (($iFlags & OPT_ATT_MUSTCHANGE) === OPT_ATT_MUSTCHANGE) ? 'true' : 'false';
|
|
||||||
$sAttMetaDataFlagMustPrompt = (($iFlags & OPT_ATT_MUSTPROMPT) === OPT_ATT_MUSTPROMPT) ? 'true' : 'false';
|
|
||||||
$sAttMetaDataFlagSlave = (($iFlags & OPT_ATT_SLAVE) === OPT_ATT_SLAVE) ? 'true' : 'false';
|
|
||||||
|
|
||||||
$sInputId = $this->m_iFormId.'_'.$sAttCode;
|
|
||||||
|
|
||||||
if ((!$bEditMode) || ($iFlags & (OPT_ATT_READONLY | OPT_ATT_SLAVE)))
|
|
||||||
{
|
|
||||||
// Check if the attribute is not read-only because of a synchro...
|
|
||||||
if ($iFlags & OPT_ATT_SLAVE)
|
|
||||||
{
|
|
||||||
$aReasons = array();
|
|
||||||
$sTip = '';
|
|
||||||
foreach($aReasons as $aRow) {
|
|
||||||
$sDescription = utils::EscapeHtml($aRow['description']);
|
|
||||||
$sDescription = str_replace(array("\r\n", "\n"), "<br/>", $sDescription);
|
|
||||||
$sTip .= "<div class=\"synchro-source\">";
|
|
||||||
$sTip .= "<div class=\"synchro-source-title\">Synchronized with {$aRow['name']}</div>";
|
|
||||||
$sTip .= "<div class=\"synchro-source-description\">$sDescription</div>";
|
|
||||||
}
|
|
||||||
$sTip = addslashes($sTip);
|
|
||||||
$oPage->add_ready_script("$('#synchro_$sInputId').qtip( { content: '$sTip', show: 'mouseover', hide: 'mouseout', style: { name: 'dark', tip: 'leftTop' }, position: { corner: { target: 'rightMiddle', tooltip: 'leftTop' }} } );");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Attribute is read-only
|
|
||||||
$sHTMLValue = $this->GetAsHTML($sAttCode);
|
|
||||||
$sHTMLValue .= '<input type="hidden" id="'.$sInputId.'" name="attr_'.$sPrefix.$sAttCode.'" value="'.utils::EscapeHtml($this->GetEditValue($sAttCode)).'"/>';
|
|
||||||
$aFieldsMap[$sAttCode] = $sInputId;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$sValue = $this->Get($sAttCode);
|
|
||||||
$sDisplayValue = $this->GetEditValue($sAttCode);
|
|
||||||
$aArgs = array('this' => $this, 'formPrefix' => $sPrefix);
|
|
||||||
|
|
||||||
$sCommentAsHtml = ($sComment != '') ? '<span>'.$sComment.'</span><br/>' : '';
|
|
||||||
$sFieldAsHtml = self::GetFormElementForField($oPage, $sClass, $sAttCode, $oAttDef, $sValue, $sDisplayValue, $sInputId, '', $iFlags, $aArgs);
|
|
||||||
$sHTMLValue = <<<HTML
|
|
||||||
<div class="field_data">
|
|
||||||
<div class="field_value">
|
|
||||||
$sCommentAsHtml
|
|
||||||
$sFieldAsHtml
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
HTML;
|
|
||||||
|
|
||||||
$aFieldsMap[$sAttCode] = $sInputId;
|
|
||||||
}
|
|
||||||
|
|
||||||
$oPage->add(<<<HTML
|
|
||||||
<fieldset>
|
|
||||||
<legend>{$sAttLabel}</legend>
|
|
||||||
<div class="field_container field_large" data-attribute-code="{$sAttCode}" data-attribute-type="{$sAttDefClass}" data-attribute-label="{$sAttMetaDataLabel}"
|
|
||||||
data-attribute-flag-hidden="{$sAttMetaDataFlagHidden}" data-attribute-flag-read-only="{$sAttMetaDataFlagReadOnly}" data-attribute-flag-mandatory="{$sAttMetaDataFlagMandatory}"
|
|
||||||
data-attribute-flag-must-change="{$sAttMetaDataFlagMustChange}" data-attribute-flag-must-prompt="{$sAttMetaDataFlagMustPrompt}" data-attribute-flag-slave="{$sAttMetaDataFlagSlave}">
|
|
||||||
{$sHTMLValue}
|
|
||||||
</div>
|
|
||||||
</fieldset>
|
|
||||||
HTML
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Special display where the case log uses the whole "screen" at the bottom of the "Properties" tab
|
* Special display where the case log uses the whole "screen" at the bottom of the "Properties" tab
|
||||||
*
|
*
|
||||||
@@ -5028,66 +4646,6 @@ HTML
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param $sCurrentState
|
|
||||||
* @param $sStimulus
|
|
||||||
* @param $bOnlyNewOnes
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
* @throws \ApplicationException
|
|
||||||
* @throws \CoreException
|
|
||||||
* @deprecated Since iTop 2.4, use DBObject::GetTransitionAttributes() instead.
|
|
||||||
*/
|
|
||||||
public function GetExpectedAttributes($sCurrentState, $sStimulus, $bOnlyNewOnes)
|
|
||||||
{
|
|
||||||
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('Since iTop 2.4, use DBObject::GetTransitionAttributes() instead');
|
|
||||||
$aTransitions = $this->EnumTransitions();
|
|
||||||
if (!isset($aTransitions[$sStimulus])) {
|
|
||||||
// Invalid stimulus
|
|
||||||
throw new ApplicationException(Dict::Format('UI:Error:Invalid_Stimulus_On_Object_In_State', $sStimulus,
|
|
||||||
$this->GetName(), $this->GetStateLabel()));
|
|
||||||
}
|
|
||||||
$aTransition = $aTransitions[$sStimulus];
|
|
||||||
$sTargetState = $aTransition['target_state'];
|
|
||||||
$aTargetStates = MetaModel::EnumStates(get_class($this));
|
|
||||||
$aTargetState = $aTargetStates[$sTargetState];
|
|
||||||
$aCurrentState = $aTargetStates[$this->GetState()];
|
|
||||||
$aExpectedAttributes = $aTargetState['attribute_list'];
|
|
||||||
$aCurrentAttributes = $aCurrentState['attribute_list'];
|
|
||||||
|
|
||||||
$aComputedAttributes = array();
|
|
||||||
foreach($aExpectedAttributes as $sAttCode => $iExpectCode)
|
|
||||||
{
|
|
||||||
if (!array_key_exists($sAttCode, $aCurrentAttributes))
|
|
||||||
{
|
|
||||||
$aComputedAttributes[$sAttCode] = $iExpectCode;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!($aCurrentAttributes[$sAttCode] & (OPT_ATT_HIDDEN | OPT_ATT_READONLY)))
|
|
||||||
{
|
|
||||||
$iExpectCode = $iExpectCode & ~(OPT_ATT_MUSTPROMPT | OPT_ATT_MUSTCHANGE); // Already prompted/changed, reset the flags
|
|
||||||
}
|
|
||||||
// Later: better check if the attribute is not *null*
|
|
||||||
if (($iExpectCode & OPT_ATT_MANDATORY) && ($this->Get($sAttCode) != ''))
|
|
||||||
{
|
|
||||||
$iExpectCode = $iExpectCode & ~(OPT_ATT_MANDATORY); // If the attribute is present, then no need to request its presence
|
|
||||||
}
|
|
||||||
|
|
||||||
$aComputedAttributes[$sAttCode] = $iExpectCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
$aComputedAttributes[$sAttCode] = $aComputedAttributes[$sAttCode] & ~(OPT_ATT_READONLY | OPT_ATT_HIDDEN); // Don't care about this form now
|
|
||||||
|
|
||||||
if ($aComputedAttributes[$sAttCode] == 0)
|
|
||||||
{
|
|
||||||
unset($aComputedAttributes[$sAttCode]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $aComputedAttributes;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Display a form for modifying several objects at once
|
* Display a form for modifying several objects at once
|
||||||
* The form will be submitted to the current page, with the specified additional values
|
* The form will be submitted to the current page, with the specified additional values
|
||||||
@@ -5207,7 +4765,7 @@ HTML
|
|||||||
$aKeys = array_keys($aValues[$sAttCode]);
|
$aKeys = array_keys($aValues[$sAttCode]);
|
||||||
$currValue = $aKeys[0]; // The only value is the first key
|
$currValue = $aKeys[0]; // The only value is the first key
|
||||||
if ($oAttDef->GetEditClass() == 'LinkedSet') {
|
if ($oAttDef->GetEditClass() == 'LinkedSet') {
|
||||||
$oOrmLinkSet = $oDummyObj->Get($sAttCode);
|
$oOrmLinkSet = $oDummyObj->Get($sAttCode);
|
||||||
LinkSetDataTransformer::StringToOrmLinkSet($aValues[$sAttCode][$currValue]['edit_value'], $oOrmLinkSet);
|
LinkSetDataTransformer::StringToOrmLinkSet($aValues[$sAttCode][$currValue]['edit_value'], $oOrmLinkSet);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -5261,7 +4819,7 @@ HTML
|
|||||||
}
|
}
|
||||||
$oDummyObj->Set($sAttCode, $oTagSet);
|
$oDummyObj->Set($sAttCode, $oTagSet);
|
||||||
} else if ($oAttDef->GetEditClass() == 'LinkedSet') {
|
} else if ($oAttDef->GetEditClass() == 'LinkedSet') {
|
||||||
$oOrmLinkSet = $oDummyObj->Get($sAttCode);
|
$oOrmLinkSet = $oDummyObj->Get($sAttCode);
|
||||||
foreach ($aMultiValues as $key => $sValue) {
|
foreach ($aMultiValues as $key => $sValue) {
|
||||||
LinkSetDataTransformer::StringToOrmLinkSet($sValue['edit_value'], $oOrmLinkSet);
|
LinkSetDataTransformer::StringToOrmLinkSet($sValue['edit_value'], $oOrmLinkSet);
|
||||||
}
|
}
|
||||||
@@ -5963,7 +5521,7 @@ JS
|
|||||||
{
|
{
|
||||||
$this->NotifyAttachedObjectsOnLinkClassModification();
|
$this->NotifyAttachedObjectsOnLinkClassModification();
|
||||||
$this->RemoveObjectAwaitingEventDbLinksChanged(get_class($this), $this->GetKey());
|
$this->RemoveObjectAwaitingEventDbLinksChanged(get_class($this), $this->GetKey());
|
||||||
$this->FireEvent(EVENT_DB_AFTER_WRITE, ['is_new' => $bIsNew, 'changes' => $aChanges, 'stimulus_applied' => $sStimulusBeingApplied]);
|
$this->FireEvent(EVENT_DB_AFTER_WRITE, ['is_new' => $bIsNew, 'changes' => $aChanges, 'stimulus_applied' => $sStimulusBeingApplied, 'cmdb_change' => self::GetCurrentChange()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////
|
//////////////
|
||||||
@@ -6001,7 +5559,7 @@ JS
|
|||||||
final protected function FireEventAfterDelete(): void
|
final protected function FireEventAfterDelete(): void
|
||||||
{
|
{
|
||||||
$this->NotifyAttachedObjectsOnLinkClassModification();
|
$this->NotifyAttachedObjectsOnLinkClassModification();
|
||||||
$this->FireEvent(EVENT_DB_AFTER_DELETE);
|
$this->FireEvent(EVENT_DB_AFTER_DELETE, ['cmdb_change' => self::GetCurrentChange()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/CSVPage.php, now loadable using autoloader
|
|
||||||
* @license http://opensource.org/licenses/AGPL-3.0
|
|
||||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
|
||||||
*/
|
|
||||||
|
|
||||||
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/CSVPage.php, now loadable using autoloader');
|
|
||||||
@@ -296,21 +296,21 @@ abstract class Dashboard
|
|||||||
public function FromParams($aParams)
|
public function FromParams($aParams)
|
||||||
{
|
{
|
||||||
$this->sLayoutClass = $aParams['layout_class'];
|
$this->sLayoutClass = $aParams['layout_class'];
|
||||||
|
if (!is_subclass_of($this->sLayoutClass,DashboardLayout::class)) {
|
||||||
|
throw new InvalidParameterException('Invalid parameter layout_class "'.$aParams['layout_class'].'"');
|
||||||
|
}
|
||||||
$this->sTitle = $aParams['title'];
|
$this->sTitle = $aParams['title'];
|
||||||
$this->bAutoReload = $aParams['auto_reload'] == 'true';
|
$this->bAutoReload = $aParams['auto_reload'] == 'true';
|
||||||
$this->iAutoReloadSec = max(MetaModel::GetConfig()->Get('min_reload_interval'), (int) $aParams['auto_reload_sec']);
|
$this->iAutoReloadSec = max(MetaModel::GetConfig()->Get('min_reload_interval'), (int) $aParams['auto_reload_sec']);
|
||||||
|
|
||||||
foreach($aParams['cells'] as $aCell)
|
foreach($aParams['cells'] as $aCell) {
|
||||||
{
|
|
||||||
$aCellDashlets = array();
|
$aCellDashlets = array();
|
||||||
foreach($aCell as $aDashletParams)
|
foreach($aCell as $aDashletParams) {
|
||||||
{
|
|
||||||
$sDashletClass = $aDashletParams['dashlet_class'];
|
$sDashletClass = $aDashletParams['dashlet_class'];
|
||||||
$sId = $aDashletParams['dashlet_id'];
|
$sId = $aDashletParams['dashlet_id'];
|
||||||
/** @var \Dashlet $oNewDashlet */
|
/** @var \Dashlet $oNewDashlet */
|
||||||
$oNewDashlet = new $sDashletClass($this->oMetaModel, $sId);
|
$oNewDashlet = new $sDashletClass($this->oMetaModel, $sId);
|
||||||
if (isset($aDashletParams['dashlet_type']))
|
if (isset($aDashletParams['dashlet_type'])) {
|
||||||
{
|
|
||||||
$oNewDashlet->SetDashletType($aDashletParams['dashlet_type']);
|
$oNewDashlet->SetDashletType($aDashletParams['dashlet_type']);
|
||||||
}
|
}
|
||||||
$oForm = $oNewDashlet->GetForm();
|
$oForm = $oNewDashlet->GetForm();
|
||||||
|
|||||||
@@ -1967,7 +1967,10 @@ class DashletHeaderStatic extends Dashlet
|
|||||||
$sIcon = $this->aProperties['icon'];
|
$sIcon = $this->aProperties['icon'];
|
||||||
|
|
||||||
$oIconSelect = $this->oModelReflection->GetIconSelectionField('icon');
|
$oIconSelect = $this->oModelReflection->GetIconSelectionField('icon');
|
||||||
$sIconPath = utils::HtmlEntities($oIconSelect->MakeFileUrl($sIcon));
|
$sIconPath = '';
|
||||||
|
if (Utils::IsNotNullOrEmptyString($sIcon)) {
|
||||||
|
$sIconPath = utils::HtmlEntities($oIconSelect->MakeFileUrl($sIcon));
|
||||||
|
}
|
||||||
|
|
||||||
return DashletFactory::MakeForDashletHeaderStatic($this->oModelReflection->DictString($sTitle), $sIconPath);
|
return DashletFactory::MakeForDashletHeaderStatic($this->oModelReflection->DictString($sTitle), $sIconPath);
|
||||||
}
|
}
|
||||||
@@ -1981,6 +1984,7 @@ class DashletHeaderStatic extends Dashlet
|
|||||||
$oForm->AddField($oField);
|
$oForm->AddField($oField);
|
||||||
|
|
||||||
$oField = $this->oModelReflection->GetIconSelectionField('icon', Dict::S('UI:DashletHeaderStatic:Prop-Icon'), $this->aProperties['icon']);
|
$oField = $this->oModelReflection->GetIconSelectionField('icon', Dict::S('UI:DashletHeaderStatic:Prop-Icon'), $this->aProperties['icon']);
|
||||||
|
$oField->AddAllowedValue(['value' => '', 'label' => Dict::S('UI:DashletIcon:None'), 'icon' => '']);
|
||||||
$oForm->AddField($oField);
|
$oForm->AddField($oField);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2093,7 +2097,10 @@ class DashletHeaderDynamic extends Dashlet
|
|||||||
$sGroupBy = $this->aProperties['group_by'];
|
$sGroupBy = $this->aProperties['group_by'];
|
||||||
|
|
||||||
$oIconSelect = $this->oModelReflection->GetIconSelectionField('icon');
|
$oIconSelect = $this->oModelReflection->GetIconSelectionField('icon');
|
||||||
$sIconPath = $oIconSelect->MakeFileUrl($sIcon);
|
$sIconPath = '';
|
||||||
|
if (Utils::IsNotNullOrEmptyString($sIcon)) {
|
||||||
|
$sIconPath = $oIconSelect->MakeFileUrl($sIcon);
|
||||||
|
}
|
||||||
|
|
||||||
$aValues = $this->GetValues();
|
$aValues = $this->GetValues();
|
||||||
if (count($aValues) > 0) {
|
if (count($aValues) > 0) {
|
||||||
@@ -2223,6 +2230,7 @@ class DashletHeaderDynamic extends Dashlet
|
|||||||
$oForm->AddField($oField);
|
$oForm->AddField($oField);
|
||||||
|
|
||||||
$oField = $this->oModelReflection->GetIconSelectionField('icon', Dict::S('UI:DashletHeaderDynamic:Prop-Icon'), $this->aProperties['icon']);
|
$oField = $this->oModelReflection->GetIconSelectionField('icon', Dict::S('UI:DashletHeaderDynamic:Prop-Icon'), $this->aProperties['icon']);
|
||||||
|
$oField->AddAllowedValue(['value' => '', 'label' => Dict::S('UI:DashletIcon:None'), 'icon' => '']);
|
||||||
$oForm->AddField($oField);
|
$oForm->AddField($oField);
|
||||||
|
|
||||||
$oField = new DesignerTextField('subtitle', Dict::S('UI:DashletHeaderDynamic:Prop-Subtitle'), $this->aProperties['subtitle']);
|
$oField = new DesignerTextField('subtitle', Dict::S('UI:DashletHeaderDynamic:Prop-Subtitle'), $this->aProperties['subtitle']);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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>
|
<classes>
|
||||||
<class id="AbstractResource" _delta="define">
|
<class id="AbstractResource" _delta="define">
|
||||||
<parent>cmdbAbstractObject</parent>
|
<parent>cmdbAbstractObject</parent>
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
<properties>
|
<properties>
|
||||||
<comment>/** Acknowledge welcome popup messages */</comment>
|
<comment>/** Acknowledge welcome popup messages */</comment>
|
||||||
<abstract>false</abstract>
|
<abstract>false</abstract>
|
||||||
<category></category>
|
<category/>
|
||||||
<key_type>autoincrement</key_type>
|
<key_type>autoincrement</key_type>
|
||||||
<db_table>priv_welcome_popup_acknowledge</db_table>
|
<db_table>priv_welcome_popup_acknowledge</db_table>
|
||||||
</properties>
|
</properties>
|
||||||
@@ -111,7 +111,6 @@
|
|||||||
<menu id="UserManagement" xsi:type="TemplateMenuNode" _delta="define">
|
<menu id="UserManagement" xsi:type="TemplateMenuNode" _delta="define">
|
||||||
<rank>10</rank>
|
<rank>10</rank>
|
||||||
<parent>AdminTools</parent>
|
<parent>AdminTools</parent>
|
||||||
<template_file/>
|
|
||||||
</menu>
|
</menu>
|
||||||
<menu id="UserAccountsMenu" xsi:type="OQLMenuNode" _delta="define">
|
<menu id="UserAccountsMenu" xsi:type="OQLMenuNode" _delta="define">
|
||||||
<rank>11</rank>
|
<rank>11</rank>
|
||||||
@@ -141,7 +140,6 @@
|
|||||||
<menu id="Queries" xsi:type="TemplateMenuNode" _delta="define">
|
<menu id="Queries" xsi:type="TemplateMenuNode" _delta="define">
|
||||||
<rank>30</rank>
|
<rank>30</rank>
|
||||||
<parent>AdminTools</parent>
|
<parent>AdminTools</parent>
|
||||||
<template_file/>
|
|
||||||
</menu>
|
</menu>
|
||||||
<menu id="RunQueriesMenu" xsi:type="WebPageMenuNode" _delta="define">
|
<menu id="RunQueriesMenu" xsi:type="WebPageMenuNode" _delta="define">
|
||||||
<rank>31</rank>
|
<rank>31</rank>
|
||||||
@@ -188,7 +186,6 @@
|
|||||||
<menu id="Integrations" xsi:type="TemplateMenuNode" _delta="define">
|
<menu id="Integrations" xsi:type="TemplateMenuNode" _delta="define">
|
||||||
<rank>50</rank>
|
<rank>50</rank>
|
||||||
<parent>ConfigurationTools</parent>
|
<parent>ConfigurationTools</parent>
|
||||||
<template_file/>
|
|
||||||
</menu>
|
</menu>
|
||||||
<menu id="DataSources" xsi:type="OQLMenuNode" _delta="define">
|
<menu id="DataSources" xsi:type="OQLMenuNode" _delta="define">
|
||||||
<rank>20</rank>
|
<rank>20</rank>
|
||||||
|
|||||||
@@ -1,880 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableSettings;
|
|
||||||
use Combodo\iTop\Application\WebPage\WebPage;
|
|
||||||
use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright (C) 2013-2024 Combodo SAS
|
|
||||||
*
|
|
||||||
* This file is part of iTop.
|
|
||||||
*
|
|
||||||
* iTop is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* iTop is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
*
|
|
||||||
* @deprecated 3.0.0 use Combodo\iTop\Application\UI\Base\Component\DataTable\Datatable
|
|
||||||
*/
|
|
||||||
|
|
||||||
class DataTable
|
|
||||||
{
|
|
||||||
protected $iListId; // Unique ID inside the web page
|
|
||||||
/** @var string */
|
|
||||||
private $sDatatableContainerId;
|
|
||||||
protected $sTableId; // identifier for saving the settings (combined with the class aliases)
|
|
||||||
protected $oSet; // The set of objects to display
|
|
||||||
protected $aClassAliases; // The aliases (alias => class) inside the set
|
|
||||||
protected $iNbObjects; // Total number of objects in the set
|
|
||||||
protected $bUseCustomSettings; // Whether or not the current display uses custom settings
|
|
||||||
protected $oDefaultSettings; // the default settings for displaying such a list
|
|
||||||
protected $bShowObsoleteData;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $iListId Unique ID for this div/table in the page
|
|
||||||
* @param DBObjectSet $oSet The set of data to display
|
|
||||||
* @param array$aClassAliases The list of classes/aliases to be displayed in this set $sAlias => $sClassName
|
|
||||||
* @param string $sTableId A string (or null) identifying this table in order to persist its settings
|
|
||||||
*
|
|
||||||
* @throws \CoreException
|
|
||||||
* @throws \MissingQueryArgument
|
|
||||||
* @throws \MySQLException
|
|
||||||
* @throws \MySQLHasGoneAwayException
|
|
||||||
*/
|
|
||||||
public function __construct($iListId, $oSet, $aClassAliases, $sTableId = null)
|
|
||||||
{
|
|
||||||
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('use Combodo\iTop\Application\UI\Base\Component\DataTable\Datatable');
|
|
||||||
$this->iListId = utils::GetSafeId($iListId); // Make a "safe" ID for jQuery
|
|
||||||
$this->sDatatableContainerId = 'datatable_'.utils::GetSafeId($iListId);
|
|
||||||
$this->oSet = $oSet;
|
|
||||||
$this->aClassAliases = $aClassAliases;
|
|
||||||
$this->sTableId = $sTableId;
|
|
||||||
$this->iNbObjects = $oSet->Count();
|
|
||||||
$this->bUseCustomSettings = false;
|
|
||||||
$this->oDefaultSettings = null;
|
|
||||||
$this->bShowObsoleteData = $oSet->GetShowObsoleteData();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param WebPage $oPage
|
|
||||||
* @param DataTableSettings $oSettings
|
|
||||||
* @param $bActionsMenu
|
|
||||||
* @param $sSelectMode
|
|
||||||
* @param $bViewLink
|
|
||||||
* @param $aExtraParams
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @throws \CoreException
|
|
||||||
* @throws \MySQLException
|
|
||||||
*/
|
|
||||||
public function Display(WebPage $oPage, DataTableSettings $oSettings, $bActionsMenu, $sSelectMode, $bViewLink, $aExtraParams)
|
|
||||||
{
|
|
||||||
$this->oDefaultSettings = $oSettings;
|
|
||||||
|
|
||||||
// Identified tables can have their own specific settings
|
|
||||||
$oCustomSettings = DataTableSettings::GetTableSettings($this->aClassAliases, $this->sTableId);
|
|
||||||
|
|
||||||
if ($oCustomSettings != null)
|
|
||||||
{
|
|
||||||
// Custom settings overload the default ones
|
|
||||||
$this->bUseCustomSettings = true;
|
|
||||||
if ($this->oDefaultSettings->iDefaultPageSize == 0)
|
|
||||||
{
|
|
||||||
$oCustomSettings->iDefaultPageSize = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$oCustomSettings = $oSettings;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($oCustomSettings->iDefaultPageSize > 0)
|
|
||||||
{
|
|
||||||
$this->oSet->SetLimit($oCustomSettings->iDefaultPageSize);
|
|
||||||
}
|
|
||||||
$this->oSet->SetOrderBy($oCustomSettings->GetSortOrder());
|
|
||||||
|
|
||||||
// Load only the requested columns
|
|
||||||
$aColumnsToLoad = array();
|
|
||||||
foreach($oCustomSettings->aColumns as $sAlias => $aColumnsInfo)
|
|
||||||
{
|
|
||||||
foreach($aColumnsInfo as $sAttCode => $aData)
|
|
||||||
{
|
|
||||||
if ($sAttCode != '_key_')
|
|
||||||
{
|
|
||||||
if ($aData['checked'])
|
|
||||||
{
|
|
||||||
$aColumnsToLoad[$sAlias][] = $sAttCode;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// See if this column is a must to load
|
|
||||||
$sClass = $this->aClassAliases[$sAlias];
|
|
||||||
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
|
|
||||||
if ($oAttDef->AlwaysLoadInTables()) {
|
|
||||||
$aColumnsToLoad[$sAlias][] = $sAttCode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->oSet->OptimizeColumnLoad($aColumnsToLoad);
|
|
||||||
|
|
||||||
|
|
||||||
$bToolkitMenu = true;
|
|
||||||
if (isset($aExtraParams['toolkit_menu']))
|
|
||||||
{
|
|
||||||
$bToolkitMenu = (bool) $aExtraParams['toolkit_menu'];
|
|
||||||
}
|
|
||||||
if (UserRights::IsPortalUser())
|
|
||||||
{
|
|
||||||
// Portal users have a limited access to data, for now they can only see what's configured for them
|
|
||||||
$bToolkitMenu = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->GetAsHTML($oPage, $oCustomSettings->iDefaultPageSize, $oCustomSettings->iDefaultPageSize, 0, $oCustomSettings->aColumns, $bActionsMenu, $bToolkitMenu, $sSelectMode, $bViewLink, $aExtraParams);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param WebPage $oPage
|
|
||||||
* @param $iPageSize
|
|
||||||
* @param $iDefaultPageSize
|
|
||||||
* @param $iPageIndex
|
|
||||||
* @param $aColumns
|
|
||||||
* @param $bActionsMenu
|
|
||||||
* @param $bToolkitMenu
|
|
||||||
* @param $sSelectMode
|
|
||||||
* @param $bViewLink
|
|
||||||
* @param $aExtraParams
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @throws \ArchivedObjectException
|
|
||||||
* @throws \CoreException
|
|
||||||
*/
|
|
||||||
public function GetAsHTML(WebPage $oPage, $iPageSize, $iDefaultPageSize, $iPageIndex, $aColumns, $bActionsMenu, $bToolkitMenu, $sSelectMode, $bViewLink, $aExtraParams)
|
|
||||||
{
|
|
||||||
$sObjectsCount = $this->GetObjectCount($oPage, $sSelectMode);
|
|
||||||
$sPager = $this->GetPager($oPage, $iPageSize, $iDefaultPageSize, $iPageIndex);
|
|
||||||
$sActionsMenu = '';
|
|
||||||
$sToolkitMenu = '';
|
|
||||||
if ($bActionsMenu) {
|
|
||||||
$sActionsMenu = $this->GetActionsMenu($oPage, $aExtraParams);
|
|
||||||
}
|
|
||||||
// if ($bToolkitMenu)
|
|
||||||
// {
|
|
||||||
// $sToolkitMenu = $this->GetToolkitMenu($oPage, $aExtraParams);
|
|
||||||
// }
|
|
||||||
|
|
||||||
$sDataTable = $this->GetHTMLTable($oPage, $aColumns, $sSelectMode, $iPageSize, $bViewLink, $aExtraParams);
|
|
||||||
$sConfigDlg = $this->GetTableConfigDlg($oPage, $aColumns, $bViewLink, $iDefaultPageSize);
|
|
||||||
|
|
||||||
$sHtml = "<table id=\"{$this->sDatatableContainerId}\" class=\"datatable\">";
|
|
||||||
$sHtml .= "<tr><td>";
|
|
||||||
$sHtml .= "<table style=\"width:100%;\">";
|
|
||||||
$sHtml .= "<tr><td class=\"pagination_container\">$sObjectsCount</td><td class=\"menucontainer\">$sToolkitMenu $sActionsMenu</td></tr>";
|
|
||||||
$sHtml .= "<tr>$sPager</tr>";
|
|
||||||
$sHtml .= "</table>";
|
|
||||||
$sHtml .= "</td></tr>";
|
|
||||||
$sHtml .= "<tr><td class=\"datacontents\">$sDataTable</td></tr>";
|
|
||||||
$sHtml .= "</table>\n";
|
|
||||||
$oPage->add_at_the_end($sConfigDlg);
|
|
||||||
|
|
||||||
$aExtraParams['show_obsolete_data'] = $this->bShowObsoleteData;
|
|
||||||
|
|
||||||
$aOptions = array(
|
|
||||||
'sPersistentId' => '',
|
|
||||||
'sFilter' => $this->oSet->GetFilter()->serialize(),
|
|
||||||
'oColumns' => $aColumns,
|
|
||||||
'sSelectMode' => $sSelectMode,
|
|
||||||
'sViewLink' => ($bViewLink ? 'true' : 'false'),
|
|
||||||
'iNbObjects' => $this->iNbObjects,
|
|
||||||
'iDefaultPageSize' => $iDefaultPageSize,
|
|
||||||
'iPageSize' => $iPageSize,
|
|
||||||
'iPageIndex' => $iPageIndex,
|
|
||||||
'oClassAliases' => $this->aClassAliases,
|
|
||||||
'sTableId' => $this->sTableId,
|
|
||||||
'oExtraParams' => $aExtraParams,
|
|
||||||
'sRenderUrl' => utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php',
|
|
||||||
'oRenderParameters' => array('str' => ''), // Forces JSON to encode this as a object...
|
|
||||||
'oDefaultSettings' => array('str' => ''), // Forces JSON to encode this as a object...
|
|
||||||
'oLabels' => array('moveup' => Dict::S('UI:Button:MoveUp'), 'movedown' => Dict::S('UI:Button:MoveDown')),
|
|
||||||
);
|
|
||||||
if($this->oDefaultSettings != null)
|
|
||||||
{
|
|
||||||
$aOptions['oDefaultSettings'] = $this->GetAsHash($this->oDefaultSettings);
|
|
||||||
}
|
|
||||||
$sJSOptions = json_encode($aOptions);
|
|
||||||
$oPage->add_ready_script("$('#{$this->sDatatableContainerId}').datatable($sJSOptions);");
|
|
||||||
|
|
||||||
return $sHtml;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* When refreshing the body of a paginated table, get the rows of the table (inside the TBODY)
|
|
||||||
* return string The HTML rows to insert inside the <tbody> node
|
|
||||||
*/
|
|
||||||
public function GetAsHTMLTableRows(WebPage $oPage, $iPageSize, $aColumns, $sSelectMode, $bViewLink, $aExtraParams)
|
|
||||||
{
|
|
||||||
if ($iPageSize < 1)
|
|
||||||
{
|
|
||||||
$iPageSize = -1; // convention: no pagination
|
|
||||||
}
|
|
||||||
$aAttribs = $this->GetHTMLTableConfig($aColumns, $sSelectMode, $bViewLink);
|
|
||||||
$aValues = $this->GetHTMLTableValues($aColumns, $sSelectMode, $iPageSize, $bViewLink, $aExtraParams);
|
|
||||||
|
|
||||||
$sHtml = '';
|
|
||||||
foreach($aValues as $aRow)
|
|
||||||
{
|
|
||||||
$sHtml .= $oPage->GetTableRow($aRow, $aAttribs);
|
|
||||||
}
|
|
||||||
return $sHtml;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param WebPage $oPage
|
|
||||||
* @param $sSelectMode
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function GetObjectCount(WebPage $oPage, $sSelectMode)
|
|
||||||
{
|
|
||||||
if (($sSelectMode == 'single') || ($sSelectMode == 'multiple'))
|
|
||||||
{
|
|
||||||
$sHtml = '<div class="pagination_objcount">'.Dict::Format('UI:Pagination:HeaderSelection', '<span id="total">'.$this->iNbObjects.'</span>', '<span class="selectedCount">0</span>').'</div>';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$sHtml = '<div class="pagination_objcount">'.Dict::Format('UI:Pagination:HeaderNoSelection', '<span id="total">'.$this->iNbObjects.'</span>').'</div>';
|
|
||||||
}
|
|
||||||
return $sHtml;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param WebPage $oPage
|
|
||||||
* @param $iPageSize
|
|
||||||
* @param $iDefaultPageSize
|
|
||||||
* @param $iPageIndex
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function GetPager(WebPage $oPage, $iPageSize, $iDefaultPageSize, $iPageIndex)
|
|
||||||
{
|
|
||||||
$sHtml = '';
|
|
||||||
if ($iPageSize < 1) // Display all
|
|
||||||
{
|
|
||||||
$sPagerStyle = 'style="display:none"'; // no limit: display the full table, so hide the "pager" UI
|
|
||||||
// WARNING: mPDF does not take the "display" style into account
|
|
||||||
// when applied to a <td> or a <table> tag, so make sure you apply this to a div
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$sPagerStyle = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$sCombo = '<select class="pagesize">';
|
|
||||||
if($iPageSize < 1)
|
|
||||||
{
|
|
||||||
$sCombo .= "<option selected=\"selected\" value=\"-1\">".Dict::S('UI:Pagination:All')."</option>";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for($iPage = 1; $iPage < 5; $iPage++)
|
|
||||||
{
|
|
||||||
$iNbItems = $iPage * $iDefaultPageSize;
|
|
||||||
$sSelected = ($iNbItems == $iPageSize) ? 'selected="selected"' : '';
|
|
||||||
$sCombo .= "<option $sSelected value=\"$iNbItems\">$iNbItems</option>";
|
|
||||||
}
|
|
||||||
$sCombo .= "<option value=\"-1\">".Dict::S('UI:Pagination:All')."</option>";
|
|
||||||
}
|
|
||||||
|
|
||||||
$sCombo .= '</select>';
|
|
||||||
|
|
||||||
$sPages = Dict::S('UI:Pagination:PagesLabel');
|
|
||||||
$sPageSizeCombo = Dict::Format('UI:Pagination:PageSize', $sCombo);
|
|
||||||
|
|
||||||
$iNbPages = ($iPageSize < 1) ? 1 : ceil($this->iNbObjects / $iPageSize);
|
|
||||||
if ($iNbPages == 1)
|
|
||||||
{
|
|
||||||
// No need to display the pager
|
|
||||||
$sPagerStyle = 'style="display:none"';
|
|
||||||
}
|
|
||||||
$aPagesToDisplay = array();
|
|
||||||
for($idx = 0; $idx <= min(4, $iNbPages-1); $idx++)
|
|
||||||
{
|
|
||||||
if ($idx == 0)
|
|
||||||
{
|
|
||||||
$aPagesToDisplay[$idx] = '<span page="0" class="curr_page">1</span>';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$aPagesToDisplay[$idx] = "<span id=\"gotopage_$idx\" class=\"gotopage\" page=\"$idx\">".(1+$idx)."</span>";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$iLastPageIdx = $iNbPages - 1;
|
|
||||||
if (!isset($aPagesToDisplay[$iLastPageIdx]))
|
|
||||||
{
|
|
||||||
unset($aPagesToDisplay[$idx - 1]); // remove the last page added to make room for the very last page
|
|
||||||
$aPagesToDisplay[$iLastPageIdx] = "<span id=\"gotopage_$iLastPageIdx\" class=\"gotopage\" page=\"$iLastPageIdx\">... $iNbPages</span>";
|
|
||||||
}
|
|
||||||
$sPagesLinks = implode('', $aPagesToDisplay);
|
|
||||||
$sPagesList = '['.implode(',', array_keys($aPagesToDisplay)).']';
|
|
||||||
|
|
||||||
$sAppRootUrl = utils::GetAbsoluteUrlAppRoot();
|
|
||||||
$sSelectionMode = ($iNbPages == 1) ? '' : 'positive';
|
|
||||||
$sHtml =
|
|
||||||
<<<EOF
|
|
||||||
<td colspan="2">
|
|
||||||
<div $sPagerStyle>
|
|
||||||
<table id="pager{$this->iListId}" class="pager"><tr>
|
|
||||||
<td>$sPages</td>
|
|
||||||
<td><img src="{$sAppRootUrl}images/first.png" class="first"/>AAAA</td>
|
|
||||||
<td><img src="{$sAppRootUrl}images/prev.png" class="prev"/></td>
|
|
||||||
<td><span id="index">$sPagesLinks</span></td>
|
|
||||||
<td><img src="{$sAppRootUrl}images/next.png" class="next"/></td>
|
|
||||||
<td><img src="{$sAppRootUrl}images/last.png" class="last"/></td>
|
|
||||||
<td>$sPageSizeCombo</td>
|
|
||||||
<td><span id="loading"> </span><input type="hidden" name="selectionMode" value="$sSelectionMode"></input>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
EOF;
|
|
||||||
return $sHtml;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param WebPage $oPage
|
|
||||||
* @param $aExtraParams
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @throws \ApplicationException
|
|
||||||
* @throws \ArchivedObjectException
|
|
||||||
* @throws \CoreException
|
|
||||||
* @throws \CoreUnexpectedValue
|
|
||||||
* @throws \DictExceptionMissingString
|
|
||||||
* @throws \MissingQueryArgument
|
|
||||||
* @throws \MySQLException
|
|
||||||
* @throws \MySQLHasGoneAwayException
|
|
||||||
* @throws \OQLException
|
|
||||||
* @throws \ReflectionException
|
|
||||||
* @throws \Twig\Error\LoaderError
|
|
||||||
* @throws \Twig\Error\RuntimeError
|
|
||||||
* @throws \Twig\Error\SyntaxError
|
|
||||||
*/
|
|
||||||
protected function GetActionsMenu(WebPage $oPage, $aExtraParams)
|
|
||||||
{
|
|
||||||
$oMenuBlock = new MenuBlock($this->oSet->GetFilter(), 'list');
|
|
||||||
$oBlock = $oMenuBlock->GetRenderContent($oPage, $aExtraParams, $this->iListId);
|
|
||||||
|
|
||||||
return ConsoleBlockRenderer::RenderBlockTemplateInPage($oPage, $oBlock);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param WebPage $oPage
|
|
||||||
* @param $aExtraParams
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
protected function GetToolkitMenu(WebPage $oPage, $aExtraParams)
|
|
||||||
{
|
|
||||||
if (!$oPage->IsPrintableVersion())
|
|
||||||
{
|
|
||||||
$sMenuTitle = Dict::S('UI:ConfigureThisList');
|
|
||||||
$sHtml = '<div class="itop_popup toolkit_menu" id="tk_'.$this->iListId.'"><ul><li aria-label="'.Dict::S('UI:Menu:Toolkit').'"><i class="fas fa-tools"></i><i class="fas fa-caret-down"></i><ul>';
|
|
||||||
|
|
||||||
$oMenuItem1 = new JSPopupMenuItem('iTop::ConfigureList', $sMenuTitle, "$('#datatable_dlg_".$this->iListId."').dialog('open');");
|
|
||||||
$aActions = array(
|
|
||||||
$oMenuItem1->GetUID() => $oMenuItem1->GetMenuItem(),
|
|
||||||
);
|
|
||||||
$this->oSet->Rewind();
|
|
||||||
utils::GetPopupMenuItems($oPage, iPopupMenuExtension::MENU_OBJLIST_TOOLKIT, $this->oSet, $aActions, $this->sTableId, $this->iListId);
|
|
||||||
$this->oSet->Rewind();
|
|
||||||
$sHtml .= $oPage->RenderPopupMenuItems($aActions);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$sHtml = '';
|
|
||||||
}
|
|
||||||
return $sHtml;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param WebPage $oPage
|
|
||||||
* @param $aColumns
|
|
||||||
* @param $bViewLink
|
|
||||||
* @param $iDefaultPageSize
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
protected function GetTableConfigDlg(WebPage $oPage, $aColumns, $bViewLink, $iDefaultPageSize)
|
|
||||||
{
|
|
||||||
$sHtml = "<div id=\"datatable_dlg_{$this->iListId}\" style=\"display: none;\">";
|
|
||||||
$sHtml .= "<form onsubmit=\"return false\">";
|
|
||||||
$sChecked = ($this->bUseCustomSettings) ? '' : 'checked';
|
|
||||||
$sHtml .= "<p><input id=\"dtbl_dlg_settings_{$this->iListId}\" type=\"radio\" name=\"settings\" $sChecked value=\"defaults\"><label for=\"dtbl_dlg_settings_{$this->iListId}\"> ".Dict::S('UI:UseDefaultSettings').'</label></p>';
|
|
||||||
$sHtml .= "<fieldset>";
|
|
||||||
$sChecked = ($this->bUseCustomSettings) ? 'checked': '';
|
|
||||||
$sHtml .= "<legend class=\"transparent\"><input id=\"dtbl_dlg_specific_{$this->iListId}\" type=\"radio\" class=\"specific_settings\" name=\"settings\" $sChecked value=\"specific\"><label for=\"dtbl_dlg_specific_{$this->iListId}\"> ".Dict::S('UI:UseSpecificSettings')."</label></legend>";
|
|
||||||
$sHtml .= Dict::S('UI:ColumnsAndSortOrder').'<br/><ul class="sortable_field_list" id="sfl_'.$this->iListId.'"></ul>';
|
|
||||||
|
|
||||||
$sHtml .= '<p>'.Dict::Format('UI:Display_X_ItemsPerPage', '<input type="text" size="4" name="page_size" value="'.$iDefaultPageSize.'">').'</p>';
|
|
||||||
$sHtml .= "</fieldset>";
|
|
||||||
$sHtml .= "<fieldset>";
|
|
||||||
$sSaveChecked = ($this->sTableId != null) ? 'checked' : '';
|
|
||||||
$sCustomDisabled = ($this->sTableId == null) ? 'disabled="disabled" stay-disabled="true" ' : '';
|
|
||||||
$sCustomChecked = ($this->sTableId != null) ? 'checked' : '';
|
|
||||||
$sGenericChecked = ($this->sTableId == null) ? 'checked' : '';
|
|
||||||
$sHtml .= "<legend class=\"transparent\"><input id=\"dtbl_dlg_save_{$this->iListId}\" type=\"checkbox\" $sSaveChecked name=\"save_settings\"><label for=\"dtbl_dlg_save_{$this->iListId}\"> ".Dict::S('UI:UseSavetheSettings')."</label></legend>";
|
|
||||||
$sHtml .= "<p><input id=\"dtbl_dlg_this_list_{$this->iListId}\" type=\"radio\" name=\"scope\" $sCustomChecked $sCustomDisabled value=\"this_list\"><label for=\"dtbl_dlg_this_list_{$this->iListId}\"> ".Dict::S('UI:OnlyForThisList').'</label> ';
|
|
||||||
$sHtml .= "<input id=\"dtbl_dlg_all_{$this->iListId}\" type=\"radio\" name=\"scope\" $sGenericChecked value=\"defaults\"><label for=\"dtbl_dlg_all_{$this->iListId}\"> ".Dict::S('UI:ForAllLists').'</label></p>';
|
|
||||||
$sHtml .= "</fieldset>";
|
|
||||||
$sHtml .= '<table style="width:100%"><tr><td style="text-align:center;">';
|
|
||||||
$sHtml .= '<button type="button" onclick="$(\'#'.$this->sDatatableContainerId.'\').datatable(\'onDlgCancel\'); $(\'#datatable_dlg_'.$this->iListId.'\').dialog(\'close\')">'.Dict::S('UI:Button:Cancel').'</button>';
|
|
||||||
$sHtml .= '</td><td style="text-align:center;">';
|
|
||||||
$sHtml .= '<button type="submit" onclick="$(\'#'.$this->sDatatableContainerId.'\').datatable(\'onDlgOk\');$(\'#datatable_dlg_'.$this->iListId.'\').dialog(\'close\');">'.Dict::S('UI:Button:Ok').'</button>';
|
|
||||||
$sHtml .= '</td></tr></table>';
|
|
||||||
$sHtml .= "</form>";
|
|
||||||
$sHtml .= "</div>";
|
|
||||||
|
|
||||||
$sDlgTitle = addslashes(Dict::S('UI:ListConfigurationTitle'));
|
|
||||||
$oPage->add_ready_script("$('#datatable_dlg_{$this->iListId}').dialog({autoOpen: false, title: '$sDlgTitle', width: 500, close: function() { $('#{$this->sDatatableContainerId}').datatable('onDlgCancel'); } });");
|
|
||||||
|
|
||||||
return $sHtml;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param $oSetting
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function GetAsHash($oSetting)
|
|
||||||
{
|
|
||||||
$aSettings = array('iDefaultPageSize' => $oSetting->iDefaultPageSize, 'oColumns' => $oSetting->aColumns);
|
|
||||||
return $aSettings;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $aColumns
|
|
||||||
* @param string $sSelectMode
|
|
||||||
* @param bool $bViewLink
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
* @throws \CoreException
|
|
||||||
* @throws \DictExceptionMissingString
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
protected function GetHTMLTableConfig($aColumns, $sSelectMode, $bViewLink)
|
|
||||||
{
|
|
||||||
$aAttribs = array();
|
|
||||||
if ($sSelectMode == 'multiple')
|
|
||||||
{
|
|
||||||
$aAttribs['form::select'] = array(
|
|
||||||
'label' => "<input type=\"checkbox\" onClick=\"CheckAll('.selectList{$this->iListId}:not(:disabled)', this.checked);\" class=\"checkAll\"></input>",
|
|
||||||
'description' => Dict::S('UI:SelectAllToggle+'),
|
|
||||||
'metadata' => array(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else if ($sSelectMode == 'single')
|
|
||||||
{
|
|
||||||
$aAttribs['form::select'] = array('label' => '', 'description' => '', 'metadata' => array());
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach($this->aClassAliases as $sAlias => $sClassName)
|
|
||||||
{
|
|
||||||
foreach($aColumns[$sAlias] as $sAttCode => $aData)
|
|
||||||
{
|
|
||||||
if ($aData['checked'])
|
|
||||||
{
|
|
||||||
if ($sAttCode == '_key_')
|
|
||||||
{
|
|
||||||
$sAttLabel = MetaModel::GetName($sClassName);
|
|
||||||
|
|
||||||
$aAttribs['key_'.$sAlias] = array(
|
|
||||||
'label' => $sAttLabel,
|
|
||||||
'description' => '',
|
|
||||||
'metadata' => array(
|
|
||||||
'object_class' => $sClassName,
|
|
||||||
'attribute_label' => $sAttLabel,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttCode);
|
|
||||||
$sAttDefClass = get_class($oAttDef);
|
|
||||||
$sAttLabel = MetaModel::GetLabel($sClassName, $sAttCode);
|
|
||||||
|
|
||||||
$aAttribs[$sAttCode.'_'.$sAlias] = array(
|
|
||||||
'label' => $sAttLabel,
|
|
||||||
'description' => $oAttDef->GetOrderByHint(),
|
|
||||||
'metadata' => array(
|
|
||||||
'object_class' => $sClassName,
|
|
||||||
'attribute_code' => $sAttCode,
|
|
||||||
'attribute_type' => $sAttDefClass,
|
|
||||||
'attribute_label' => $sAttLabel,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $aAttribs;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param $aColumns
|
|
||||||
* @param $sSelectMode
|
|
||||||
* @param $iPageSize
|
|
||||||
* @param $bViewLink
|
|
||||||
* @param $aExtraParams
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
* @throws \CoreException
|
|
||||||
* @throws \CoreUnexpectedValue
|
|
||||||
* @throws \MissingQueryArgument
|
|
||||||
* @throws \MySQLException
|
|
||||||
* @throws \MySQLHasGoneAwayException
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
protected function GetHTMLTableValues($aColumns, $sSelectMode, $iPageSize, $bViewLink, $aExtraParams)
|
|
||||||
{
|
|
||||||
$bLocalize = true;
|
|
||||||
if (isset($aExtraParams['localize_values']))
|
|
||||||
{
|
|
||||||
$bLocalize = (bool) $aExtraParams['localize_values'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$aValues = array();
|
|
||||||
$aAttDefsCache = array();
|
|
||||||
$this->oSet->Seek(0);
|
|
||||||
$iMaxObjects = $iPageSize;
|
|
||||||
while (($aObjects = $this->oSet->FetchAssoc()) && ($iMaxObjects != 0))
|
|
||||||
{
|
|
||||||
$bFirstObject = true;
|
|
||||||
$aRow = array();
|
|
||||||
foreach($this->aClassAliases as $sAlias => $sClassName)
|
|
||||||
{
|
|
||||||
if (is_object($aObjects[$sAlias]))
|
|
||||||
{
|
|
||||||
$sHilightClass = MetaModel::GetHilightClass($sClassName, $aObjects[$sAlias]);
|
|
||||||
if ($sHilightClass != '')
|
|
||||||
{
|
|
||||||
$aRow['@class'] = $sHilightClass;
|
|
||||||
}
|
|
||||||
if ((($sSelectMode == 'single') || ($sSelectMode == 'multiple')) && $bFirstObject)
|
|
||||||
{
|
|
||||||
if (array_key_exists('selection_enabled', $aExtraParams) && isset($aExtraParams['selection_enabled'][$aObjects[$sAlias]->GetKey()]))
|
|
||||||
{
|
|
||||||
$sDisabled = ($aExtraParams['selection_enabled'][$aObjects[$sAlias]->GetKey()]) ? '' : ' disabled="disabled"';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$sDisabled = '';
|
|
||||||
}
|
|
||||||
if ($sSelectMode == 'single')
|
|
||||||
{
|
|
||||||
$aRow['form::select'] = "<input type=\"radio\" $sDisabled class=\"selectList{$this->iListId}\" name=\"selectObject\" value=\"".$aObjects[$sAlias]->GetKey()."\"></input>";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$aRow['form::select'] = "<input type=\"checkbox\" $sDisabled class=\"selectList{$this->iListId}\" name=\"selectObject[]\" value=\"".$aObjects[$sAlias]->GetKey()."\"></input>";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach($aColumns[$sAlias] as $sAttCode => $aData)
|
|
||||||
{
|
|
||||||
if ($aData['checked'])
|
|
||||||
{
|
|
||||||
if ($sAttCode == '_key_')
|
|
||||||
{
|
|
||||||
$aRow['key_'.$sAlias] = array(
|
|
||||||
'value_raw' => $aObjects[$sAlias]->GetKey(),
|
|
||||||
'value_html' => $aObjects[$sAlias]->GetHyperLink(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Prepare att. def. classes cache to avoid retrieving AttDef for each row
|
|
||||||
if(!isset($aAttDefsCache[$sClassName][$sAttCode]))
|
|
||||||
{
|
|
||||||
$aAttDefClassesCache[$sClassName][$sAttCode] = get_class(MetaModel::GetAttributeDef($sClassName, $sAttCode));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only retrieve raw (stored) value for simple fields
|
|
||||||
$bExcludeRawValue = false;
|
|
||||||
foreach (cmdbAbstractObject::GetAttDefClassesToExcludeFromMarkupMetadataRawValue() as $sAttDefClassToExclude)
|
|
||||||
{
|
|
||||||
if (is_a($aAttDefClassesCache[$sClassName][$sAttCode], $sAttDefClassToExclude, true))
|
|
||||||
{
|
|
||||||
$bExcludeRawValue = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if($bExcludeRawValue)
|
|
||||||
{
|
|
||||||
$aRow[$sAttCode.'_'.$sAlias] = $aObjects[$sAlias]->GetAsHTML($sAttCode, $bLocalize);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$aRow[$sAttCode.'_'.$sAlias] = array(
|
|
||||||
'value_raw' => $aObjects[$sAlias]->Get($sAttCode),
|
|
||||||
'value_html' => $aObjects[$sAlias]->GetAsHTML($sAttCode, $bLocalize),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
foreach($aColumns[$sAlias] as $sAttCode => $aData)
|
|
||||||
{
|
|
||||||
if ($aData['checked'])
|
|
||||||
{
|
|
||||||
if ($sAttCode == '_key_')
|
|
||||||
{
|
|
||||||
$aRow['key_'.$sAlias] = '';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$aRow[$sAttCode.'_'.$sAlias] = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$bFirstObject = false;
|
|
||||||
}
|
|
||||||
$aValues[] = $aRow;
|
|
||||||
$iMaxObjects--;
|
|
||||||
}
|
|
||||||
return $aValues;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param WebPage $oPage
|
|
||||||
* @param $aColumns
|
|
||||||
* @param $sSelectMode
|
|
||||||
* @param $iPageSize
|
|
||||||
* @param $bViewLink
|
|
||||||
* @param $aExtraParams
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @throws \ArchivedObjectException
|
|
||||||
* @throws \CoreException
|
|
||||||
* @throws \CoreUnexpectedValue
|
|
||||||
* @throws \DictExceptionMissingString
|
|
||||||
* @throws \MissingQueryArgument
|
|
||||||
* @throws \MySQLException
|
|
||||||
* @throws \MySQLHasGoneAwayException
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
public function GetHTMLTable(WebPage $oPage, $aColumns, $sSelectMode, $iPageSize, $bViewLink, $aExtraParams)
|
|
||||||
{
|
|
||||||
$iNbPages = ($iPageSize < 1) ? 1 : ceil($this->iNbObjects / $iPageSize);
|
|
||||||
if ($iPageSize < 1)
|
|
||||||
{
|
|
||||||
$iPageSize = -1; // convention: no pagination
|
|
||||||
}
|
|
||||||
$aAttribs = $this->GetHTMLTableConfig($aColumns, $sSelectMode, $bViewLink);
|
|
||||||
|
|
||||||
$aValues = $this->GetHTMLTableValues($aColumns, $sSelectMode, $iPageSize, $bViewLink, $aExtraParams);
|
|
||||||
|
|
||||||
$sHtml = '<table class="listContainer object-list">';
|
|
||||||
|
|
||||||
foreach($this->oSet->GetFilter()->GetInternalParams() as $sName => $sValue)
|
|
||||||
{
|
|
||||||
$aExtraParams['query_params'][$sName] = $sValue;
|
|
||||||
}
|
|
||||||
$aExtraParams['show_obsolete_data'] = $this->bShowObsoleteData;
|
|
||||||
|
|
||||||
$sHtml .= "<tr><td>";
|
|
||||||
$sHtml .= $oPage->GetTable($aAttribs, $aValues);
|
|
||||||
$sHtml .= '</td></tr>';
|
|
||||||
$sHtml .= '</table>';
|
|
||||||
$iCount = $this->iNbObjects;
|
|
||||||
|
|
||||||
$aArgs = $this->oSet->GetArgs();
|
|
||||||
$sExtraParams = addslashes(str_replace('"', "'", json_encode(array_merge($aExtraParams, $aArgs)))); // JSON encode, change the style of the quotes and escape them
|
|
||||||
$sSelectModeJS = '';
|
|
||||||
$sHeaders = '';
|
|
||||||
if (($sSelectMode == 'single') || ($sSelectMode == 'multiple'))
|
|
||||||
{
|
|
||||||
$sSelectModeJS = $sSelectMode;
|
|
||||||
$sHeaders = 'headers: { 0: {sorter: false}},';
|
|
||||||
}
|
|
||||||
$sDisplayKey = ($bViewLink) ? 'true' : 'false';
|
|
||||||
// Protect against duplicate elements in the Zlist
|
|
||||||
$aUniqueOrderedList = array();
|
|
||||||
foreach($this->aClassAliases as $sAlias => $sClassName)
|
|
||||||
{
|
|
||||||
foreach($aColumns[$sAlias] as $sAttCode => $aData)
|
|
||||||
{
|
|
||||||
if ($aData['checked'])
|
|
||||||
{
|
|
||||||
$aUniqueOrderedList[$sAttCode] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$aUniqueOrderedList = array_keys($aUniqueOrderedList);
|
|
||||||
$sJSColumns = json_encode($aColumns);
|
|
||||||
$sJSClassAliases = json_encode($this->aClassAliases);
|
|
||||||
$sCssCount = isset($aExtraParams['cssCount']) ? ", cssCount: '{$aExtraParams['cssCount']}'" : '';
|
|
||||||
$this->oSet->ApplyParameters();
|
|
||||||
// Display the actual sort order of the table
|
|
||||||
$aRealSortOrder = $this->oSet->GetRealSortOrder();
|
|
||||||
$aDefaultSort = array();
|
|
||||||
$iColOffset = 0;
|
|
||||||
if (($sSelectMode == 'single') || ($sSelectMode == 'multiple'))
|
|
||||||
{
|
|
||||||
$iColOffset += 1;
|
|
||||||
}
|
|
||||||
if ($bViewLink)
|
|
||||||
{
|
|
||||||
// $iColOffset += 1;
|
|
||||||
}
|
|
||||||
foreach($aRealSortOrder as $sColCode => $bAscending)
|
|
||||||
{
|
|
||||||
$iPos = array_search($sColCode, $aUniqueOrderedList);
|
|
||||||
if ($iPos !== false)
|
|
||||||
{
|
|
||||||
$aDefaultSort[] = "[".($iColOffset+$iPos).",".($bAscending ? '0' : '1')."]";
|
|
||||||
}
|
|
||||||
else if (($iPos = array_search(preg_replace('/_friendlyname$/', '', $sColCode), $aUniqueOrderedList)) !== false)
|
|
||||||
{
|
|
||||||
// if sorted on the friendly name of an external key, then consider it sorted on the column that shows the links
|
|
||||||
$aDefaultSort[] = "[".($iColOffset+$iPos).",".($bAscending ? '0' : '1')."]";
|
|
||||||
}
|
|
||||||
else if($sColCode == 'friendlyname' && $bViewLink)
|
|
||||||
{
|
|
||||||
$aDefaultSort[] = "[".($iColOffset).",".($bAscending ? '0' : '1')."]";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$sFakeSortList = '';
|
|
||||||
if (count($aDefaultSort) > 0)
|
|
||||||
{
|
|
||||||
$sFakeSortList = '['.implode(',', $aDefaultSort).']';
|
|
||||||
}
|
|
||||||
$sOQL = addslashes($this->oSet->GetFilter()->serialize());
|
|
||||||
$oPage->add_ready_script(
|
|
||||||
<<<JS
|
|
||||||
var oTable = $('#{$this->sDatatableContainerId} table.listResults');
|
|
||||||
oTable.tableHover();
|
|
||||||
oTable
|
|
||||||
.tablesorter({ $sHeaders widgets: ['myZebra', 'truncatedList']})
|
|
||||||
.tablesorterPager({
|
|
||||||
container: $('#pager{$this->iListId}'),
|
|
||||||
totalRows:$iCount,
|
|
||||||
size: $iPageSize,
|
|
||||||
filter: '$sOQL',
|
|
||||||
extra_params: '$sExtraParams',
|
|
||||||
select_mode: '$sSelectModeJS',
|
|
||||||
displayKey: $sDisplayKey,
|
|
||||||
table_id: '{$this->sDatatableContainerId}',
|
|
||||||
columns: $sJSColumns,
|
|
||||||
class_aliases: $sJSClassAliases $sCssCount
|
|
||||||
});
|
|
||||||
JS
|
|
||||||
);
|
|
||||||
if ($sFakeSortList != '')
|
|
||||||
{
|
|
||||||
$oPage->add_ready_script("oTable.trigger(\"fakesorton\", [$sFakeSortList]);");
|
|
||||||
}
|
|
||||||
return $sHtml;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param WebPage $oPage
|
|
||||||
* @param $iDefaultPageSize
|
|
||||||
* @param $iStart
|
|
||||||
*/
|
|
||||||
public function UpdatePager(WebPage $oPage, $iDefaultPageSize, $iStart)
|
|
||||||
{
|
|
||||||
$iPageSize = $iDefaultPageSize;
|
|
||||||
$iPageIndex = 0;
|
|
||||||
$sHtml = $this->GetPager($oPage, $iPageSize, $iDefaultPageSize, $iPageIndex);
|
|
||||||
$oPage->add_ready_script("$('#pager{$this->iListId}').html('".json_encode($sHtml)."');");
|
|
||||||
if ($iDefaultPageSize < 1)
|
|
||||||
{
|
|
||||||
$oPage->add_ready_script("$('#pager{$this->iListId}').parent().hide()");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$oPage->add_ready_script("$('#pager{$this->iListId}').parent().show()");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Simplified version of the data table with less "decoration" (and no paging)
|
|
||||||
* which is optimized for printing
|
|
||||||
*/
|
|
||||||
class PrintableDataTable extends DataTable
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param WebPage $oPage
|
|
||||||
* @param $iPageSize
|
|
||||||
* @param $iDefaultPageSize
|
|
||||||
* @param $iPageIndex
|
|
||||||
* @param $aColumns
|
|
||||||
* @param $bActionsMenu
|
|
||||||
* @param $bToolkitMenu
|
|
||||||
* @param $sSelectMode
|
|
||||||
* @param $bViewLink
|
|
||||||
* @param $aExtraParams
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @throws \ArchivedObjectException
|
|
||||||
* @throws \CoreException
|
|
||||||
* @throws \CoreUnexpectedValue
|
|
||||||
* @throws \DictExceptionMissingString
|
|
||||||
* @throws \MissingQueryArgument
|
|
||||||
* @throws \MySQLException
|
|
||||||
* @throws \MySQLHasGoneAwayException
|
|
||||||
*/
|
|
||||||
public function GetAsHTML(WebPage $oPage, $iPageSize, $iDefaultPageSize, $iPageIndex, $aColumns, $bActionsMenu, $bToolkitMenu, $sSelectMode, $bViewLink, $aExtraParams)
|
|
||||||
{
|
|
||||||
return $this->GetHTMLTable($oPage, $aColumns, $sSelectMode, -1, $bViewLink, $aExtraParams);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param WebPage $oPage
|
|
||||||
* @param $aColumns
|
|
||||||
* @param $sSelectMode
|
|
||||||
* @param $iPageSize
|
|
||||||
* @param $bViewLink
|
|
||||||
* @param $aExtraParams
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @throws \CoreException
|
|
||||||
* @throws \CoreUnexpectedValue
|
|
||||||
* @throws \DictExceptionMissingString
|
|
||||||
* @throws \MissingQueryArgument
|
|
||||||
* @throws \MySQLException
|
|
||||||
* @throws \MySQLHasGoneAwayException
|
|
||||||
*/
|
|
||||||
public function GetHTMLTable(WebPage $oPage, $aColumns, $sSelectMode, $iPageSize, $bViewLink, $aExtraParams)
|
|
||||||
{
|
|
||||||
$iNbPages = ($iPageSize < 1) ? 1 : ceil($this->iNbObjects / $iPageSize);
|
|
||||||
if ($iPageSize < 1)
|
|
||||||
{
|
|
||||||
$iPageSize = -1; // convention: no pagination
|
|
||||||
}
|
|
||||||
$aAttribs = $this->GetHTMLTableConfig($aColumns, $sSelectMode, $bViewLink);
|
|
||||||
|
|
||||||
$aValues = $this->GetHTMLTableValues($aColumns, $sSelectMode, $iPageSize, $bViewLink, $aExtraParams);
|
|
||||||
|
|
||||||
$sHtml = $oPage->GetTable($aAttribs, $aValues);
|
|
||||||
|
|
||||||
return $sHtml;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -263,6 +263,8 @@ class DisplayBlock
|
|||||||
/** param for export.php */
|
/** param for export.php */
|
||||||
'refresh_action',
|
'refresh_action',
|
||||||
/**to add refresh button in datatable*/
|
/**to add refresh button in datatable*/
|
||||||
|
'object_count',
|
||||||
|
/** int number of objects in list */
|
||||||
], DataTableUIBlockFactory::GetAllowedParams()),
|
], DataTableUIBlockFactory::GetAllowedParams()),
|
||||||
static::ENUM_STYLE_LIST_SEARCH => array_merge([
|
static::ENUM_STYLE_LIST_SEARCH => array_merge([
|
||||||
'update_history',
|
'update_history',
|
||||||
@@ -770,10 +772,6 @@ class DisplayBlock
|
|||||||
$oBlock = $this->RenderList($aExtraParams, $oPage);
|
$oBlock = $this->RenderList($aExtraParams, $oPage);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'links':
|
|
||||||
$oBlock = $this->RenderLinks($oPage, $aExtraParams);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case static::ENUM_STYLE_ACTIONS:
|
case static::ENUM_STYLE_ACTIONS:
|
||||||
$oBlock = $this->RenderActions($aExtraParams);
|
$oBlock = $this->RenderActions($aExtraParams);
|
||||||
break;
|
break;
|
||||||
@@ -1563,54 +1561,6 @@ JS
|
|||||||
return $oContentBlock;
|
return $oContentBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated 3.1.0 N°5957
|
|
||||||
*
|
|
||||||
* @param WebPage $oPage
|
|
||||||
* @param array $aExtraParams
|
|
||||||
*
|
|
||||||
* @return \Combodo\iTop\Application\UI\Base\Component\Html\Html|\Combodo\iTop\Application\UI\Base\Layout\UIContentBlock|string
|
|
||||||
* @throws \ApplicationException
|
|
||||||
* @throws \ArchivedObjectException
|
|
||||||
* @throws \CoreException
|
|
||||||
* @throws \CoreUnexpectedValue
|
|
||||||
* @throws \DictExceptionMissingString
|
|
||||||
* @throws \MissingQueryArgument
|
|
||||||
* @throws \MySQLException
|
|
||||||
* @throws \MySQLHasGoneAwayException
|
|
||||||
* @throws \OQLException
|
|
||||||
* @throws \ReflectionException
|
|
||||||
*/
|
|
||||||
protected function RenderLinks(WebPage $oPage, array $aExtraParams)
|
|
||||||
{
|
|
||||||
// Note: No deprecation ticket yet as we want to wait and see if people / code actually use this method, in which case we might keep it.
|
|
||||||
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('This method is most likely not used throughout the application and will be removed soon. If you ever see this message, please inform us.');
|
|
||||||
|
|
||||||
$oBlock = null;
|
|
||||||
if (($this->m_oSet->CountWithLimit(1) > 0) && (UserRights::IsActionAllowed($this->m_oSet->GetClass(), UR_ACTION_READ, $this->m_oSet) == UR_ALLOWED_YES)) {
|
|
||||||
$oBlock = cmdbAbstractObject::GetDisplaySetBlock($oPage, $this->m_oSet, $aExtraParams);
|
|
||||||
} else {
|
|
||||||
$sClass = $this->m_oFilter->GetClass();
|
|
||||||
$oAttDef = MetaModel::GetAttributeDef($sClass, $this->m_aParams['target_attr']);
|
|
||||||
$sTargetClass = $oAttDef->GetTargetClass();
|
|
||||||
$oBlock = new Html('<p>'.Dict::Format('UI:NoObject_Class_ToDisplay', MetaModel::GetName($sTargetClass)).'</p>');
|
|
||||||
$bDisplayMenu = isset($this->m_aParams['menu']) ? $this->m_aParams['menu'] == true : true;
|
|
||||||
if ($bDisplayMenu) {
|
|
||||||
if ((UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY) == UR_ALLOWED_YES)) {
|
|
||||||
$sDefaults = '';
|
|
||||||
if (isset($this->m_aParams['default'])) {
|
|
||||||
foreach ($this->m_aParams['default'] as $sName => $sValue) {
|
|
||||||
$sDefaults .= '&'.urlencode($sName).'='.urlencode($sValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$oBlock->AddHtml("<p><a href=\"".utils::GetAbsoluteUrlAppRoot()."pages/UI.php?operation=modify_links&class=$sClass&sParams&link_attr=".$aExtraParams['link_attr']."&id=".$aExtraParams['object_id']."&target_class=$sTargetClass&addObjects=true$sDefaults\">".Dict::Format('UI:ClickToCreateNew',
|
|
||||||
Metamodel::GetName($sClass))."</a></p>\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $oBlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string|null $sChartId
|
* @param string|null $sChartId
|
||||||
* @param array $aQueryParams
|
* @param array $aQueryParams
|
||||||
@@ -1863,7 +1813,11 @@ class MenuBlock extends DisplayBlock
|
|||||||
$aSelectedClasses = $this->GetFilter()->GetSelectedClasses();
|
$aSelectedClasses = $this->GetFilter()->GetSelectedClasses();
|
||||||
$bIsForLinkset = isset($aExtraParams['target_attr']);
|
$bIsForLinkset = isset($aExtraParams['target_attr']);
|
||||||
$oSet = new CMDBObjectSet($this->GetFilter());
|
$oSet = new CMDBObjectSet($this->GetFilter());
|
||||||
$iSetCount = $oSet->Count();
|
if(isset($aExtraParams['object_count'])){
|
||||||
|
$iSetCount = $aExtraParams['object_count'];
|
||||||
|
} else {
|
||||||
|
$iSetCount = $oSet->Count();
|
||||||
|
}
|
||||||
/** @var string $sRefreshAction JS snippet to run when clicking on the refresh button of the menu */
|
/** @var string $sRefreshAction JS snippet to run when clicking on the refresh button of the menu */
|
||||||
$sRefreshAction = $aExtraParams['refresh_action'] ?? '';
|
$sRefreshAction = $aExtraParams['refresh_action'] ?? '';
|
||||||
$bIsCreationInModal = isset($aExtraParams['creation_in_modal']) && $aExtraParams['creation_in_modal'] === true;
|
$bIsCreationInModal = isset($aExtraParams['creation_in_modal']) && $aExtraParams['creation_in_modal'] === true;
|
||||||
@@ -2218,6 +2172,11 @@ class MenuBlock extends DisplayBlock
|
|||||||
$aFavoriteRegularActions[$key] = $aRegularActions[$key];
|
$aFavoriteRegularActions[$key] = $aRegularActions[$key];
|
||||||
unset($aRegularActions[$key]);
|
unset($aRegularActions[$key]);
|
||||||
}
|
}
|
||||||
|
// Toolkit actions
|
||||||
|
if (isset($aToolkitActions[$key])) {
|
||||||
|
$aFavoriteRegularActions[$key] = $aToolkitActions[$key];
|
||||||
|
unset($aToolkitActions[$key]);
|
||||||
|
}
|
||||||
|
|
||||||
// Transitions
|
// Transitions
|
||||||
if (isset($aTransitionActions[$key])) {
|
if (isset($aTransitionActions[$key])) {
|
||||||
@@ -2307,7 +2266,27 @@ class MenuBlock extends DisplayBlock
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'UI:Menu:EMail':
|
case 'UI:Menu:EMail':
|
||||||
$sIconClass = 'fas fa-share-alt';
|
$sIconClass = 'far fa-envelope fa-lg';
|
||||||
|
$sLabel = '';
|
||||||
|
break;
|
||||||
|
case 'UI:Menu:OpenOQL':
|
||||||
|
$sIconClass = 'fas fa-play fa-sm';
|
||||||
|
$sLabel = '';
|
||||||
|
break;
|
||||||
|
case 'UI:Menu:ExportXLSX':
|
||||||
|
$sIconClass = 'far fa-file-excel fa-lg';
|
||||||
|
$sLabel = '';
|
||||||
|
break;
|
||||||
|
case 'UI:Menu:CSVExport':
|
||||||
|
$sIconClass = 'fas fa-file-csv fa-lg';
|
||||||
|
$sLabel = '';
|
||||||
|
break;
|
||||||
|
case 'UI:Menu:PrintableVersion':
|
||||||
|
$sIconClass = 'fas fa-print';
|
||||||
|
$sLabel = '';
|
||||||
|
break;
|
||||||
|
case 'UI:Menu:ExportPDF':
|
||||||
|
$sIconClass = 'fas fa-file-pdf fa-lg';
|
||||||
$sLabel = '';
|
$sLabel = '';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -2319,7 +2298,12 @@ class MenuBlock extends DisplayBlock
|
|||||||
}
|
}
|
||||||
|
|
||||||
$sTarget = isset($aAction['target']) ? $aAction['target'] : '';
|
$sTarget = isset($aAction['target']) ? $aAction['target'] : '';
|
||||||
$oActionButton = ButtonUIBlockFactory::MakeLinkNeutral($sUrl, $sLabel, $sIconClass, $sTarget, utils::Sanitize($sActionId, '', utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER));
|
if (!empty($aAction['onclick'])) {
|
||||||
|
$oActionButton = ButtonUIBlockFactory::MakeIconAction($sIconClass, $aAction['label'], $aAction['label'], $sLabel,false); //utils::Sanitize($sActionId.md5($aAction['onclick']), '', utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER))
|
||||||
|
$oActionButton->SetOnClickJsCode($aAction['onclick']);
|
||||||
|
} else {
|
||||||
|
$oActionButton = ButtonUIBlockFactory::MakeLinkNeutral($sUrl, $sLabel, $sIconClass, $sTarget, utils::Sanitize($sActionId, '', utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER));
|
||||||
|
}
|
||||||
// ResourceId should not be sanitized
|
// ResourceId should not be sanitized
|
||||||
$oActionButton->AddDataAttribute('resource-id', $sActionId);
|
$oActionButton->AddDataAttribute('resource-id', $sActionId);
|
||||||
$oActionButton->AddCSSClasses(['ibo-action-button', 'ibo-regular-action-button']);
|
$oActionButton->AddCSSClasses(['ibo-action-button', 'ibo-regular-action-button']);
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/ErrorPage.php, now loadable using autoloader
|
|
||||||
* @license http://opensource.org/licenses/AGPL-3.0
|
|
||||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
|
||||||
*/
|
|
||||||
|
|
||||||
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/ErrorPage.php, now loadable using autoloader');
|
|
||||||
@@ -303,7 +303,7 @@ class ExcelExporter
|
|||||||
{
|
{
|
||||||
if ($this->sOutputFilePath == null)
|
if ($this->sOutputFilePath == null)
|
||||||
{
|
{
|
||||||
return APPROOT.'data/bulk_export/'.$this->sToken.'.xlsx';
|
return utils::GetDataPath().'bulk_export/'.$this->sToken.'.xlsx';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -313,14 +313,14 @@ class ExcelExporter
|
|||||||
|
|
||||||
public static function GetExcelFileFromToken($sToken)
|
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)
|
public static function CleanupFromToken($sToken)
|
||||||
{
|
{
|
||||||
@unlink(APPROOT.'data/bulk_export/'.$sToken.'.status');
|
@unlink(utils::GetDataPath().'bulk_export/'.$sToken.'.status');
|
||||||
@unlink(APPROOT.'data/bulk_export/'.$sToken.'.data');
|
@unlink(utils::GetDataPath().'bulk_export/'.$sToken.'.data');
|
||||||
@unlink(APPROOT.'data/bulk_export/'.$sToken.'.xlsx');
|
@unlink(utils::GetDataPath().'bulk_export/'.$sToken.'.xlsx');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function Cleanup()
|
public function Cleanup()
|
||||||
@@ -334,7 +334,7 @@ class ExcelExporter
|
|||||||
*/
|
*/
|
||||||
public static function CleanupOldFiles()
|
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');
|
$iDelay = MetaModel::GetConfig()->Get('xlsx_exporter_cleanup_old_files_delay');
|
||||||
|
|
||||||
if($iDelay > 0)
|
if($iDelay > 0)
|
||||||
@@ -416,14 +416,14 @@ class ExcelExporter
|
|||||||
|
|
||||||
protected function CheckDataDir()
|
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();
|
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;
|
$sToken = $this->sToken;
|
||||||
}
|
}
|
||||||
return APPROOT."data/bulk_export/$sToken.status";
|
return utils::GetDataPath()."bulk_export/$sToken.status";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function GetDataFile()
|
protected function GetDataFile()
|
||||||
{
|
{
|
||||||
return APPROOT.'data/bulk_export/'.$this->sToken.'.data';
|
return utils::GetDataPath().'bulk_export/'.$this->sToken.'.data';
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function GetNewToken()
|
protected function GetNewToken()
|
||||||
|
|||||||
@@ -363,7 +363,7 @@ $('#$sDialogId').dialog({
|
|||||||
buttons: [
|
buttons: [
|
||||||
{ text: "$sOkButtonLabel", click: function() {
|
{ text: "$sOkButtonLabel", click: function() {
|
||||||
var oForm = $(this).closest('.ui-dialog').find('form');
|
var oForm = $(this).closest('.ui-dialog').find('form');
|
||||||
oForm.submit();
|
oForm.trigger('submit');
|
||||||
if (AnimateDlgButtons)
|
if (AnimateDlgButtons)
|
||||||
{
|
{
|
||||||
sFormId = oForm.attr('id');
|
sFormId = oForm.attr('id');
|
||||||
@@ -1501,6 +1501,11 @@ class DesignerIconSelectionField extends DesignerFormField
|
|||||||
$this->aAllowedValues = $aAllowedValues;
|
$this->aAllowedValues = $aAllowedValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function AddAllowedValue($aValue)
|
||||||
|
{
|
||||||
|
// Add a null value to the list of allowed values
|
||||||
|
$this->aAllowedValues = array_merge([$aValue], $this->aAllowedValues);
|
||||||
|
}
|
||||||
public function EnableUpload($sIconUploadUrl)
|
public function EnableUpload($sIconUploadUrl)
|
||||||
{
|
{
|
||||||
$this->sUploadUrl = $sIconUploadUrl;
|
$this->sUploadUrl = $sIconUploadUrl;
|
||||||
|
|||||||
@@ -36,29 +36,30 @@ class InputOutputTask extends cmdbAbstractObject
|
|||||||
{
|
{
|
||||||
$aParams = array
|
$aParams = array
|
||||||
(
|
(
|
||||||
"category" => "application",
|
"category" => "application",
|
||||||
"key_type" => "autoincrement",
|
"key_type" => "autoincrement",
|
||||||
"name_attcode" => "name",
|
"name_attcode" => "name",
|
||||||
"state_attcode" => "",
|
"state_attcode" => "",
|
||||||
"reconc_keys" => array(),
|
"reconc_keys" => array(),
|
||||||
"db_table" => "priv_iotask",
|
"db_table" => "priv_iotask",
|
||||||
"db_key_field" => "id",
|
"db_key_field" => "id",
|
||||||
"db_finalclass_field" => "",
|
"db_finalclass_field" => "",
|
||||||
);
|
);
|
||||||
MetaModel::Init_Params($aParams);
|
MetaModel::Init_Params($aParams);
|
||||||
MetaModel::Init_AddAttribute(new AttributeString("name", array("allowed_values"=>null, "sql"=>"name", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
MetaModel::Init_AddAttribute(new AttributeString("name", array("allowed_values" => null, "sql" => "name", "default_value" => "", "is_null_allowed" => false, "depends_on" => array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeString("description", array("allowed_values"=>null, "sql"=>"description", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
|
MetaModel::Init_AddAttribute(new AttributeString("description", array("allowed_values" => null, "sql" => "description", "default_value" => "", "is_null_allowed" => true, "depends_on" => array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("category", array("allowed_values"=>new ValueSetEnum('Input, Ouput'), "sql"=>"category", "default_value"=>"Input", "is_null_allowed"=>false, "depends_on"=>array())));
|
MetaModel::Init_AddAttribute(new AttributeEnum("category", array("allowed_values" => new ValueSetEnum('Input, Ouput'), "sql" => "category", "default_value" => "Input", "is_null_allowed" => false, "depends_on" => array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("source_type", array("allowed_values"=>new ValueSetEnum('File, Database, Web Service'), "sql"=>"source_type", "default_value"=>"File", "is_null_allowed"=>false, "depends_on"=>array())));
|
MetaModel::Init_AddAttribute(new AttributeEnum("source_type", array("allowed_values" => new ValueSetEnum('File, Database, Web Service'), "sql" => "source_type", "default_value" => "File", "is_null_allowed" => false, "depends_on" => array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("source_subtype", array("allowed_values"=>new ValueSetEnum('Oracle, MySQL, Postgress, MSSQL, SOAP, HTTP-Get, HTTP-Post, XML/RPC, CSV, XML, Excel'), "sql"=>"source_subtype", "default_value"=>"CSV", "is_null_allowed"=>false, "depends_on"=>array())));
|
MetaModel::Init_AddAttribute(new AttributeEnum("source_subtype",
|
||||||
MetaModel::Init_AddAttribute(new AttributeString("source_path", array("allowed_values"=>null, "sql"=>"source_path", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
array("allowed_values" => new ValueSetEnum('Oracle, MySQL, Postgress, MSSQL, SOAP, HTTP-Get, HTTP-Post, XML/RPC, CSV, XML, Excel'), "sql" => "source_subtype", "default_value" => "CSV", "is_null_allowed" => false, "depends_on" => array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeClass("objects_class", array("class_category"=>"", "more_values"=>"", "sql"=>"objects_class", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
|
MetaModel::Init_AddAttribute(new AttributeString("source_path", array("allowed_values" => null, "sql" => "source_path", "default_value" => "", "is_null_allowed" => false, "depends_on" => array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("test_mode", array("allowed_values"=>new ValueSetEnum('Yes,No'), "sql"=>"test_mode", "default_value"=>'No', "is_null_allowed"=>false, "depends_on"=>array())));
|
MetaModel::Init_AddAttribute(new AttributeClass("objects_class", array("class_category" => "", "more_values" => "", "sql" => "objects_class", "default_value" => null, "is_null_allowed" => true, "depends_on" => array(), "class_exclusion_list" => null)));
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("verbose_mode", array("allowed_values"=>new ValueSetEnum('Yes,No'), "sql"=>"verbose_mode", "default_value" => 'No', "is_null_allowed"=>false, "depends_on"=>array())));
|
MetaModel::Init_AddAttribute(new AttributeEnum("test_mode", array("allowed_values" => new ValueSetEnum('Yes,No'), "sql" => "test_mode", "default_value" => 'No', "is_null_allowed" => false, "depends_on" => array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("options", array("allowed_values"=>new ValueSetEnum('Full, Update Only, Creation Only'), "sql"=>"options", "default_value"=> 'Full', "is_null_allowed"=>true, "depends_on"=>array())));
|
MetaModel::Init_AddAttribute(new AttributeEnum("verbose_mode", array("allowed_values" => new ValueSetEnum('Yes,No'), "sql" => "verbose_mode", "default_value" => 'No', "is_null_allowed" => false, "depends_on" => array())));
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeEnum("options", array("allowed_values" => new ValueSetEnum('Full, Update Only, Creation Only'), "sql" => "options", "default_value" => 'Full', "is_null_allowed" => true, "depends_on" => array())));
|
||||||
|
|
||||||
// Display lists
|
// Display lists
|
||||||
MetaModel::Init_SetZListItems('details', array('name', 'description', 'category', 'objects_class', 'source_type', 'source_subtype', 'source_path' , 'options', 'test_mode', 'verbose_mode')); // Attributes to be displayed for the complete details
|
MetaModel::Init_SetZListItems('details', array('name', 'description', 'category', 'objects_class', 'source_type', 'source_subtype', 'source_path', 'options', 'test_mode', 'verbose_mode')); // Attributes to be displayed for the complete details
|
||||||
MetaModel::Init_SetZListItems('list', array('description', 'category', 'objects_class', 'source_type', 'source_subtype', 'options')); // Attributes to be displayed for a list
|
MetaModel::Init_SetZListItems('list', array('description', 'category', 'objects_class', 'source_type', 'source_subtype', 'options')); // Attributes to be displayed for a list
|
||||||
// Search criteria
|
// Search criteria
|
||||||
MetaModel::Init_SetZListItems('standard_search', array('name', 'category', 'objects_class', 'source_type', 'source_subtype')); // Criteria of the std search form
|
MetaModel::Init_SetZListItems('standard_search', array('name', 'category', 'objects_class', 'source_type', 'source_subtype')); // Criteria of the std search form
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user