mirror of
https://github.com/Combodo/iTop.git
synced 2026-04-22 18:18:46 +02:00
Compare commits
1 Commits
faf/module
...
2.2.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7e331e6e12 |
101
.doc/README.md
101
.doc/README.md
@@ -1,101 +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
|
|
||||||
|
|
||||||
Note : PHP7 is required. Migrating to PHP8 requires some additional work which is questionable as an alternative way to generate a documentation is being considered.
|
|
||||||
|
|
||||||
```
|
|
||||||
cd .doc
|
|
||||||
composer require phpdocumentor/phpdocumentor:~2 --dev
|
|
||||||
```
|
|
||||||
|
|
||||||
## 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 |
@@ -1,104 +0,0 @@
|
|||||||
# iTop version history
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
%%{init: { 'logLevel': 'debug', 'theme': 'base', 'themeVariables': {
|
|
||||||
'git0': 'lawngreen',
|
|
||||||
'git3': 'dodgerblue',
|
|
||||||
'git4': 'grey',
|
|
||||||
'git5': 'grey',
|
|
||||||
'git6': 'grey',
|
|
||||||
'git7': 'grey'
|
|
||||||
}, 'gitGraph': {'showBranches': true,'mainBranchName': 'develop','rotateCommitLabel': true}} }%%
|
|
||||||
gitGraph
|
|
||||||
commit id: "2016-07-06" tag: "2.3.0" type: HIGHLIGHT
|
|
||||||
branch support/2.3 order: 900
|
|
||||||
commit id: "2016-07-08" tag: "2.3.1"
|
|
||||||
commit id: "2016-12-22" tag: "2.3.3"
|
|
||||||
commit id: "2017-04-14" tag: "2.3.4"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2017-07-12" tag: "2.4.0-beta" type: REVERSE
|
|
||||||
commit id: "2017-11-16" tag: "2.4.0" type: HIGHLIGHT
|
|
||||||
branch support/2.4 order: 890
|
|
||||||
commit id: "2018-02-14" tag: "2.4.1"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2018-04-25" tag: "2.5.0-beta" type: REVERSE
|
|
||||||
checkout support/2.4
|
|
||||||
commit id: "2018-06-14" tag: "2.4.2"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2018-06-27" tag: "2.5.0" type: HIGHLIGHT
|
|
||||||
branch support/2.5 order: 880
|
|
||||||
checkout develop
|
|
||||||
commit id: "2019-01-09" tag: "2.6.0" type: HIGHLIGHT
|
|
||||||
branch support/2.6 order: 870
|
|
||||||
commit id: "2019-03-28" tag: "2.6.1"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2019-12-18" tag: "2.7.0-beta" type: REVERSE
|
|
||||||
checkout support/2.5
|
|
||||||
commit id: "2020-01-22" tag: "2.5.4"
|
|
||||||
checkout support/2.6
|
|
||||||
commit id: "2020-01-23" tag: "2.6.3"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2020-01-29" tag: "2.7.0-beta2" type: REVERSE
|
|
||||||
commit id: "2020-04-01" tag: "2.7.0-1" type: HIGHLIGHT
|
|
||||||
checkout support/2.6
|
|
||||||
commit id: "2020-04-22" tag: "2.6.4"
|
|
||||||
checkout develop
|
|
||||||
branch support/2.7 order: 860
|
|
||||||
commit id: "2020-06-26" tag: "2.7.1"
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2020-12-09" tag: "2.7.3"
|
|
||||||
commit id: "2021-03-31" tag: "2.7.4"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2021-04-06" tag: "3.0.0-beta" type: REVERSE
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2021-07-05" tag: "2.7.5"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2021-07-05." tag: "3.0.0-beta2" type: REVERSE
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2021-12-17" tag: "2.7.6"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2022-01-04" tag: "3.0.0" type: HIGHLIGHT
|
|
||||||
branch support/3.0 order: 850
|
|
||||||
commit id: "2022-04-08" tag: "3.0.1"
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2022-07-11" tag: "2.7.7"
|
|
||||||
checkout support/3.0
|
|
||||||
commit id: "2022-09-12" tag: "3.0.2-1"
|
|
||||||
checkout develop
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2022-12-28" tag: "2.7.8"
|
|
||||||
checkout support/3.0
|
|
||||||
commit id: "2023-04-12" tag: "3.0.3"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2023-06-19" tag: "3.1.0-beta" type: REVERSE
|
|
||||||
commit id: "2023-07-26" tag: "3.1.0-1" type: HIGHLIGHT
|
|
||||||
branch support/3.1 order: 840
|
|
||||||
checkout support/3.1
|
|
||||||
commit id: "2023-08-09" tag: "3.1.0-2"
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2023-08-10" tag: "2.7.9"
|
|
||||||
checkout support/3.1
|
|
||||||
commit id: "2023-12-20" tag: "3.1.1"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2024-01-15" tag: "Start 3.2" type: HIGHLIGHT
|
|
||||||
branch support/3.2 order: 830
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2024-01-17a" tag: "2.7.10"
|
|
||||||
checkout support/3.0
|
|
||||||
commit id: "2024-01-17b" tag: "3.0.4"
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2024-09-28" tag: "2.7.11"
|
|
||||||
checkout support/3.1
|
|
||||||
commit id: "2024-09-27" tag: "3.1.2"
|
|
||||||
checkout support/3.2
|
|
||||||
commit id: "2024-06-25" tag: "3.2.0-beta1" type: REVERSE
|
|
||||||
commit id: "2024-08-07" tag: "3.2.0"
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2025-02-25" tag: "2.7.12"
|
|
||||||
checkout support/3.1
|
|
||||||
commit id: "2025-02-25 " tag: "3.1.3"
|
|
||||||
checkout support/3.2
|
|
||||||
commit id: "2025-02-25 " tag: "3.2.1"
|
|
||||||
```
|
|
||||||
|
|
||||||
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').on('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>
|
|
||||||
575
.editorconfig
575
.editorconfig
@@ -1,575 +0,0 @@
|
|||||||
root = true
|
|
||||||
|
|
||||||
[*]
|
|
||||||
charset = utf-8
|
|
||||||
end_of_line = lf
|
|
||||||
indent_size = 4
|
|
||||||
indent_style = space
|
|
||||||
insert_final_newline = false
|
|
||||||
max_line_length = 300
|
|
||||||
tab_width = 4
|
|
||||||
ij_continuation_indent_size = 8
|
|
||||||
ij_formatter_off_tag = @formatter:off
|
|
||||||
ij_formatter_on_tag = @formatter:on
|
|
||||||
ij_formatter_tags_enabled = true
|
|
||||||
ij_smart_tabs = false
|
|
||||||
ij_visual_guides = 300
|
|
||||||
ij_wrap_on_typing = true
|
|
||||||
|
|
||||||
[*.css]
|
|
||||||
indent_style = tab
|
|
||||||
ij_smart_tabs = true
|
|
||||||
ij_visual_guides = none
|
|
||||||
ij_css_align_closing_brace_with_properties = false
|
|
||||||
ij_css_blank_lines_around_nested_selector = 1
|
|
||||||
ij_css_blank_lines_between_blocks = 1
|
|
||||||
ij_css_brace_placement = end_of_line
|
|
||||||
ij_css_enforce_quotes_on_format = false
|
|
||||||
ij_css_hex_color_long_format = false
|
|
||||||
ij_css_hex_color_lower_case = false
|
|
||||||
ij_css_hex_color_short_format = false
|
|
||||||
ij_css_hex_color_upper_case = false
|
|
||||||
ij_css_keep_blank_lines_in_code = 2
|
|
||||||
ij_css_keep_indents_on_empty_lines = false
|
|
||||||
ij_css_keep_single_line_blocks = false
|
|
||||||
ij_css_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
|
|
||||||
ij_css_space_after_colon = true
|
|
||||||
ij_css_space_before_opening_brace = true
|
|
||||||
ij_css_use_double_quotes = true
|
|
||||||
ij_css_value_alignment = do_not_align
|
|
||||||
|
|
||||||
[*.scss]
|
|
||||||
indent_size = 2
|
|
||||||
tab_width = 2
|
|
||||||
ij_visual_guides = none
|
|
||||||
ij_scss_align_closing_brace_with_properties = false
|
|
||||||
ij_scss_blank_lines_around_nested_selector = 1
|
|
||||||
ij_scss_blank_lines_between_blocks = 1
|
|
||||||
ij_scss_brace_placement = 0
|
|
||||||
ij_scss_enforce_quotes_on_format = false
|
|
||||||
ij_scss_hex_color_long_format = false
|
|
||||||
ij_scss_hex_color_lower_case = false
|
|
||||||
ij_scss_hex_color_short_format = false
|
|
||||||
ij_scss_hex_color_upper_case = false
|
|
||||||
ij_scss_keep_blank_lines_in_code = 2
|
|
||||||
ij_scss_keep_indents_on_empty_lines = false
|
|
||||||
ij_scss_keep_single_line_blocks = false
|
|
||||||
ij_scss_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
|
|
||||||
ij_scss_space_after_colon = true
|
|
||||||
ij_scss_space_before_opening_brace = true
|
|
||||||
ij_scss_use_double_quotes = true
|
|
||||||
ij_scss_value_alignment = 0
|
|
||||||
|
|
||||||
[*.twig]
|
|
||||||
ij_smart_tabs = true
|
|
||||||
ij_visual_guides = none
|
|
||||||
ij_wrap_on_typing = false
|
|
||||||
ij_twig_keep_indents_on_empty_lines = false
|
|
||||||
ij_twig_spaces_inside_comments_delimiters = true
|
|
||||||
ij_twig_spaces_inside_delimiters = true
|
|
||||||
ij_twig_spaces_inside_variable_delimiters = true
|
|
||||||
|
|
||||||
[.editorconfig]
|
|
||||||
ij_visual_guides = none
|
|
||||||
ij_editorconfig_align_group_field_declarations = false
|
|
||||||
ij_editorconfig_space_after_colon = false
|
|
||||||
ij_editorconfig_space_after_comma = true
|
|
||||||
ij_editorconfig_space_before_colon = false
|
|
||||||
ij_editorconfig_space_before_comma = false
|
|
||||||
ij_editorconfig_spaces_around_assignment_operators = true
|
|
||||||
|
|
||||||
[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.rng,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul,phpunit.xml.dist}]
|
|
||||||
indent_size = 2
|
|
||||||
tab_width = 2
|
|
||||||
ij_smart_tabs = true
|
|
||||||
ij_visual_guides = none
|
|
||||||
ij_wrap_on_typing = false
|
|
||||||
ij_xml_align_attributes = true
|
|
||||||
ij_xml_align_text = false
|
|
||||||
ij_xml_attribute_wrap = normal
|
|
||||||
ij_xml_block_comment_at_first_column = true
|
|
||||||
ij_xml_keep_blank_lines = 2
|
|
||||||
ij_xml_keep_indents_on_empty_lines = false
|
|
||||||
ij_xml_keep_line_breaks = true
|
|
||||||
ij_xml_keep_line_breaks_in_text = true
|
|
||||||
ij_xml_keep_whitespaces = false
|
|
||||||
ij_xml_keep_whitespaces_around_cdata = preserve
|
|
||||||
ij_xml_keep_whitespaces_inside_cdata = true
|
|
||||||
ij_xml_line_comment_at_first_column = true
|
|
||||||
ij_xml_space_after_tag_name = false
|
|
||||||
ij_xml_space_around_equals_in_attribute = false
|
|
||||||
ij_xml_space_inside_empty_tag = false
|
|
||||||
ij_xml_text_wrap = off
|
|
||||||
|
|
||||||
[{*.bash,*.sh,*.zsh}]
|
|
||||||
indent_size = 2
|
|
||||||
tab_width = 2
|
|
||||||
ij_visual_guides = none
|
|
||||||
ij_shell_binary_ops_start_line = false
|
|
||||||
ij_shell_keep_column_alignment_padding = false
|
|
||||||
ij_shell_minify_program = false
|
|
||||||
ij_shell_redirect_followed_by_space = false
|
|
||||||
ij_shell_switch_cases_indented = false
|
|
||||||
ij_shell_use_unix_line_separator = true
|
|
||||||
|
|
||||||
[{*.cjs,*.js}]
|
|
||||||
indent_style = tab
|
|
||||||
ij_continuation_indent_size = 4
|
|
||||||
ij_smart_tabs = true
|
|
||||||
ij_visual_guides = none
|
|
||||||
ij_javascript_align_imports = false
|
|
||||||
ij_javascript_align_multiline_array_initializer_expression = false
|
|
||||||
ij_javascript_align_multiline_binary_operation = false
|
|
||||||
ij_javascript_align_multiline_chained_methods = false
|
|
||||||
ij_javascript_align_multiline_extends_list = false
|
|
||||||
ij_javascript_align_multiline_for = true
|
|
||||||
ij_javascript_align_multiline_parameters = true
|
|
||||||
ij_javascript_align_multiline_parameters_in_calls = false
|
|
||||||
ij_javascript_align_multiline_ternary_operation = false
|
|
||||||
ij_javascript_align_object_properties = 0
|
|
||||||
ij_javascript_align_union_types = false
|
|
||||||
ij_javascript_align_var_statements = 0
|
|
||||||
ij_javascript_array_initializer_new_line_after_left_brace = false
|
|
||||||
ij_javascript_array_initializer_right_brace_on_new_line = false
|
|
||||||
ij_javascript_array_initializer_wrap = off
|
|
||||||
ij_javascript_assignment_wrap = off
|
|
||||||
ij_javascript_binary_operation_sign_on_next_line = false
|
|
||||||
ij_javascript_binary_operation_wrap = off
|
|
||||||
ij_javascript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/**
|
|
||||||
ij_javascript_blank_lines_after_imports = 1
|
|
||||||
ij_javascript_blank_lines_around_class = 1
|
|
||||||
ij_javascript_blank_lines_around_field = 0
|
|
||||||
ij_javascript_blank_lines_around_function = 1
|
|
||||||
ij_javascript_blank_lines_around_method = 1
|
|
||||||
ij_javascript_block_brace_style = end_of_line
|
|
||||||
ij_javascript_call_parameters_new_line_after_left_paren = false
|
|
||||||
ij_javascript_call_parameters_right_paren_on_new_line = false
|
|
||||||
ij_javascript_call_parameters_wrap = off
|
|
||||||
ij_javascript_catch_on_new_line = false
|
|
||||||
ij_javascript_chained_call_dot_on_new_line = true
|
|
||||||
ij_javascript_class_brace_style = end_of_line
|
|
||||||
ij_javascript_comma_on_new_line = false
|
|
||||||
ij_javascript_do_while_brace_force = always
|
|
||||||
ij_javascript_else_on_new_line = false
|
|
||||||
ij_javascript_enforce_trailing_comma = keep
|
|
||||||
ij_javascript_extends_keyword_wrap = off
|
|
||||||
ij_javascript_extends_list_wrap = off
|
|
||||||
ij_javascript_field_prefix = _
|
|
||||||
ij_javascript_file_name_style = relaxed
|
|
||||||
ij_javascript_finally_on_new_line = false
|
|
||||||
ij_javascript_for_brace_force = always
|
|
||||||
ij_javascript_for_statement_new_line_after_left_paren = false
|
|
||||||
ij_javascript_for_statement_right_paren_on_new_line = false
|
|
||||||
ij_javascript_for_statement_wrap = off
|
|
||||||
ij_javascript_force_quote_style = false
|
|
||||||
ij_javascript_force_semicolon_style = false
|
|
||||||
ij_javascript_function_expression_brace_style = end_of_line
|
|
||||||
ij_javascript_if_brace_force = always
|
|
||||||
ij_javascript_import_merge_members = global
|
|
||||||
ij_javascript_import_prefer_absolute_path = global
|
|
||||||
ij_javascript_import_sort_members = true
|
|
||||||
ij_javascript_import_sort_module_name = false
|
|
||||||
ij_javascript_import_use_node_resolution = true
|
|
||||||
ij_javascript_imports_wrap = on_every_item
|
|
||||||
ij_javascript_indent_case_from_switch = true
|
|
||||||
ij_javascript_indent_chained_calls = true
|
|
||||||
ij_javascript_indent_package_children = 0
|
|
||||||
ij_javascript_jsx_attribute_value = braces
|
|
||||||
ij_javascript_keep_blank_lines_in_code = 2
|
|
||||||
ij_javascript_keep_first_column_comment = true
|
|
||||||
ij_javascript_keep_indents_on_empty_lines = false
|
|
||||||
ij_javascript_keep_line_breaks = true
|
|
||||||
ij_javascript_keep_simple_blocks_in_one_line = false
|
|
||||||
ij_javascript_keep_simple_methods_in_one_line = false
|
|
||||||
ij_javascript_line_comment_add_space = true
|
|
||||||
ij_javascript_line_comment_at_first_column = false
|
|
||||||
ij_javascript_method_brace_style = end_of_line
|
|
||||||
ij_javascript_method_call_chain_wrap = off
|
|
||||||
ij_javascript_method_parameters_new_line_after_left_paren = false
|
|
||||||
ij_javascript_method_parameters_right_paren_on_new_line = false
|
|
||||||
ij_javascript_method_parameters_wrap = off
|
|
||||||
ij_javascript_object_literal_wrap = on_every_item
|
|
||||||
ij_javascript_parentheses_expression_new_line_after_left_paren = false
|
|
||||||
ij_javascript_parentheses_expression_right_paren_on_new_line = false
|
|
||||||
ij_javascript_place_assignment_sign_on_next_line = false
|
|
||||||
ij_javascript_prefer_as_type_cast = false
|
|
||||||
ij_javascript_prefer_explicit_types_function_expression_returns = false
|
|
||||||
ij_javascript_prefer_explicit_types_function_returns = false
|
|
||||||
ij_javascript_prefer_explicit_types_vars_fields = false
|
|
||||||
ij_javascript_prefer_parameters_wrap = false
|
|
||||||
ij_javascript_reformat_c_style_comments = false
|
|
||||||
ij_javascript_space_after_colon = true
|
|
||||||
ij_javascript_space_after_comma = true
|
|
||||||
ij_javascript_space_after_dots_in_rest_parameter = false
|
|
||||||
ij_javascript_space_after_generator_mult = true
|
|
||||||
ij_javascript_space_after_property_colon = true
|
|
||||||
ij_javascript_space_after_quest = true
|
|
||||||
ij_javascript_space_after_type_colon = true
|
|
||||||
ij_javascript_space_after_unary_not = false
|
|
||||||
ij_javascript_space_before_async_arrow_lparen = true
|
|
||||||
ij_javascript_space_before_catch_keyword = true
|
|
||||||
ij_javascript_space_before_catch_left_brace = true
|
|
||||||
ij_javascript_space_before_catch_parentheses = true
|
|
||||||
ij_javascript_space_before_class_lbrace = true
|
|
||||||
ij_javascript_space_before_class_left_brace = true
|
|
||||||
ij_javascript_space_before_colon = true
|
|
||||||
ij_javascript_space_before_comma = false
|
|
||||||
ij_javascript_space_before_do_left_brace = true
|
|
||||||
ij_javascript_space_before_else_keyword = true
|
|
||||||
ij_javascript_space_before_else_left_brace = true
|
|
||||||
ij_javascript_space_before_finally_keyword = true
|
|
||||||
ij_javascript_space_before_finally_left_brace = true
|
|
||||||
ij_javascript_space_before_for_left_brace = true
|
|
||||||
ij_javascript_space_before_for_parentheses = true
|
|
||||||
ij_javascript_space_before_for_semicolon = false
|
|
||||||
ij_javascript_space_before_function_left_parenth = true
|
|
||||||
ij_javascript_space_before_generator_mult = false
|
|
||||||
ij_javascript_space_before_if_left_brace = true
|
|
||||||
ij_javascript_space_before_if_parentheses = true
|
|
||||||
ij_javascript_space_before_method_call_parentheses = false
|
|
||||||
ij_javascript_space_before_method_left_brace = true
|
|
||||||
ij_javascript_space_before_method_parentheses = false
|
|
||||||
ij_javascript_space_before_property_colon = false
|
|
||||||
ij_javascript_space_before_quest = true
|
|
||||||
ij_javascript_space_before_switch_left_brace = true
|
|
||||||
ij_javascript_space_before_switch_parentheses = true
|
|
||||||
ij_javascript_space_before_try_left_brace = true
|
|
||||||
ij_javascript_space_before_type_colon = false
|
|
||||||
ij_javascript_space_before_unary_not = false
|
|
||||||
ij_javascript_space_before_while_keyword = true
|
|
||||||
ij_javascript_space_before_while_left_brace = true
|
|
||||||
ij_javascript_space_before_while_parentheses = true
|
|
||||||
ij_javascript_spaces_around_additive_operators = false
|
|
||||||
ij_javascript_spaces_around_arrow_function_operator = true
|
|
||||||
ij_javascript_spaces_around_assignment_operators = true
|
|
||||||
ij_javascript_spaces_around_bitwise_operators = true
|
|
||||||
ij_javascript_spaces_around_equality_operators = true
|
|
||||||
ij_javascript_spaces_around_logical_operators = true
|
|
||||||
ij_javascript_spaces_around_multiplicative_operators = true
|
|
||||||
ij_javascript_spaces_around_relational_operators = true
|
|
||||||
ij_javascript_spaces_around_shift_operators = true
|
|
||||||
ij_javascript_spaces_around_unary_operator = false
|
|
||||||
ij_javascript_spaces_within_array_initializer_brackets = false
|
|
||||||
ij_javascript_spaces_within_brackets = false
|
|
||||||
ij_javascript_spaces_within_catch_parentheses = false
|
|
||||||
ij_javascript_spaces_within_for_parentheses = false
|
|
||||||
ij_javascript_spaces_within_if_parentheses = false
|
|
||||||
ij_javascript_spaces_within_imports = false
|
|
||||||
ij_javascript_spaces_within_interpolation_expressions = false
|
|
||||||
ij_javascript_spaces_within_method_call_parentheses = false
|
|
||||||
ij_javascript_spaces_within_method_parentheses = false
|
|
||||||
ij_javascript_spaces_within_object_literal_braces = false
|
|
||||||
ij_javascript_spaces_within_object_type_braces = true
|
|
||||||
ij_javascript_spaces_within_parentheses = false
|
|
||||||
ij_javascript_spaces_within_switch_parentheses = false
|
|
||||||
ij_javascript_spaces_within_type_assertion = false
|
|
||||||
ij_javascript_spaces_within_union_types = true
|
|
||||||
ij_javascript_spaces_within_while_parentheses = false
|
|
||||||
ij_javascript_special_else_if_treatment = true
|
|
||||||
ij_javascript_ternary_operation_signs_on_next_line = false
|
|
||||||
ij_javascript_ternary_operation_wrap = off
|
|
||||||
ij_javascript_union_types_wrap = on_every_item
|
|
||||||
ij_javascript_use_chained_calls_group_indents = true
|
|
||||||
ij_javascript_use_double_quotes = true
|
|
||||||
ij_javascript_use_explicit_js_extension = global
|
|
||||||
ij_javascript_use_path_mapping = always
|
|
||||||
ij_javascript_use_public_modifier = false
|
|
||||||
ij_javascript_use_semicolon_after_statement = true
|
|
||||||
ij_javascript_var_declaration_wrap = normal
|
|
||||||
ij_javascript_while_brace_force = always
|
|
||||||
ij_javascript_while_on_new_line = false
|
|
||||||
ij_javascript_wrap_comments = false
|
|
||||||
|
|
||||||
[{*.ctp,*.hphp,*.inc,*.module,*.php,*.php4,*.php5,*.phtml}]
|
|
||||||
indent_style = tab
|
|
||||||
ij_continuation_indent_size = 4
|
|
||||||
ij_smart_tabs = true
|
|
||||||
ij_wrap_on_typing = false
|
|
||||||
ij_php_align_assignments = false
|
|
||||||
ij_php_align_class_constants = true
|
|
||||||
ij_php_align_group_field_declarations = false
|
|
||||||
ij_php_align_inline_comments = false
|
|
||||||
ij_php_align_key_value_pairs = true
|
|
||||||
ij_php_align_match_arm_bodies = false
|
|
||||||
ij_php_align_multiline_array_initializer_expression = true
|
|
||||||
ij_php_align_multiline_binary_operation = false
|
|
||||||
ij_php_align_multiline_chained_methods = false
|
|
||||||
ij_php_align_multiline_extends_list = false
|
|
||||||
ij_php_align_multiline_for = true
|
|
||||||
ij_php_align_multiline_parameters = false
|
|
||||||
ij_php_align_multiline_parameters_in_calls = false
|
|
||||||
ij_php_align_multiline_ternary_operation = false
|
|
||||||
ij_php_align_named_arguments = false
|
|
||||||
ij_php_align_phpdoc_comments = false
|
|
||||||
ij_php_align_phpdoc_param_names = false
|
|
||||||
ij_php_anonymous_brace_style = end_of_line
|
|
||||||
ij_php_api_weight = 1
|
|
||||||
ij_php_array_initializer_new_line_after_left_brace = true
|
|
||||||
ij_php_array_initializer_right_brace_on_new_line = true
|
|
||||||
ij_php_array_initializer_wrap = on_every_item
|
|
||||||
ij_php_assignment_wrap = off
|
|
||||||
ij_php_attributes_wrap = off
|
|
||||||
ij_php_author_weight = 8
|
|
||||||
ij_php_binary_operation_sign_on_next_line = false
|
|
||||||
ij_php_binary_operation_wrap = off
|
|
||||||
ij_php_blank_lines_after_class_header = 0
|
|
||||||
ij_php_blank_lines_after_function = 1
|
|
||||||
ij_php_blank_lines_after_imports = 1
|
|
||||||
ij_php_blank_lines_after_opening_tag = 0
|
|
||||||
ij_php_blank_lines_after_package = 1
|
|
||||||
ij_php_blank_lines_around_class = 1
|
|
||||||
ij_php_blank_lines_around_constants = 0
|
|
||||||
ij_php_blank_lines_around_field = 0
|
|
||||||
ij_php_blank_lines_around_method = 1
|
|
||||||
ij_php_blank_lines_before_class_end = 0
|
|
||||||
ij_php_blank_lines_before_imports = 1
|
|
||||||
ij_php_blank_lines_before_method_body = 0
|
|
||||||
ij_php_blank_lines_before_package = 1
|
|
||||||
ij_php_blank_lines_before_return_statement = 1
|
|
||||||
ij_php_blank_lines_between_imports = 0
|
|
||||||
ij_php_block_brace_style = end_of_line
|
|
||||||
ij_php_call_parameters_new_line_after_left_paren = false
|
|
||||||
ij_php_call_parameters_right_paren_on_new_line = false
|
|
||||||
ij_php_call_parameters_wrap = normal
|
|
||||||
ij_php_catch_on_new_line = true
|
|
||||||
ij_php_category_weight = 28
|
|
||||||
ij_php_class_brace_style = next_line
|
|
||||||
ij_php_comma_after_last_array_element = true
|
|
||||||
ij_php_concat_spaces = false
|
|
||||||
ij_php_copyright_weight = 28
|
|
||||||
ij_php_deprecated_weight = 2
|
|
||||||
ij_php_do_while_brace_force = always
|
|
||||||
ij_php_else_if_style = as_is
|
|
||||||
ij_php_else_on_new_line = false
|
|
||||||
ij_php_example_weight = 4
|
|
||||||
ij_php_extends_keyword_wrap = off
|
|
||||||
ij_php_extends_list_wrap = off
|
|
||||||
ij_php_fields_default_visibility = private
|
|
||||||
ij_php_filesource_weight = 28
|
|
||||||
ij_php_finally_on_new_line = true
|
|
||||||
ij_php_for_brace_force = always
|
|
||||||
ij_php_for_statement_new_line_after_left_paren = false
|
|
||||||
ij_php_for_statement_right_paren_on_new_line = false
|
|
||||||
ij_php_for_statement_wrap = off
|
|
||||||
ij_php_force_short_declaration_array_style = false
|
|
||||||
ij_php_getters_setters_naming_style = camel_case
|
|
||||||
ij_php_getters_setters_order_style = getters_first
|
|
||||||
ij_php_global_weight = 28
|
|
||||||
ij_php_group_use_wrap = on_every_item
|
|
||||||
ij_php_if_brace_force = always
|
|
||||||
ij_php_if_lparen_on_next_line = false
|
|
||||||
ij_php_if_rparen_on_next_line = false
|
|
||||||
ij_php_ignore_weight = 28
|
|
||||||
ij_php_import_sorting = alphabetic
|
|
||||||
ij_php_indent_break_from_case = true
|
|
||||||
ij_php_indent_case_from_switch = true
|
|
||||||
ij_php_indent_code_in_php_tags = false
|
|
||||||
ij_php_internal_weight = 0
|
|
||||||
ij_php_keep_blank_lines_after_lbrace = 2
|
|
||||||
ij_php_keep_blank_lines_before_right_brace = 2
|
|
||||||
ij_php_keep_blank_lines_in_code = 2
|
|
||||||
ij_php_keep_blank_lines_in_declarations = 2
|
|
||||||
ij_php_keep_control_statement_in_one_line = true
|
|
||||||
ij_php_keep_first_column_comment = true
|
|
||||||
ij_php_keep_indents_on_empty_lines = false
|
|
||||||
ij_php_keep_line_breaks = true
|
|
||||||
ij_php_keep_rparen_and_lbrace_on_one_line = false
|
|
||||||
ij_php_keep_simple_classes_in_one_line = false
|
|
||||||
ij_php_keep_simple_methods_in_one_line = false
|
|
||||||
ij_php_lambda_brace_style = end_of_line
|
|
||||||
ij_php_license_weight = 28
|
|
||||||
ij_php_line_comment_add_space = false
|
|
||||||
ij_php_line_comment_at_first_column = true
|
|
||||||
ij_php_link_weight = 28
|
|
||||||
ij_php_lower_case_boolean_const = true
|
|
||||||
ij_php_lower_case_keywords = true
|
|
||||||
ij_php_lower_case_null_const = true
|
|
||||||
ij_php_method_brace_style = next_line
|
|
||||||
ij_php_method_call_chain_wrap = off
|
|
||||||
ij_php_method_parameters_new_line_after_left_paren = true
|
|
||||||
ij_php_method_parameters_right_paren_on_new_line = true
|
|
||||||
ij_php_method_parameters_wrap = normal
|
|
||||||
ij_php_method_weight = 28
|
|
||||||
ij_php_modifier_list_wrap = false
|
|
||||||
ij_php_multiline_chained_calls_semicolon_on_new_line = false
|
|
||||||
ij_php_namespace_brace_style = 1
|
|
||||||
ij_php_new_line_after_php_opening_tag = false
|
|
||||||
ij_php_null_type_position = in_the_end
|
|
||||||
ij_php_package_weight = 28
|
|
||||||
ij_php_param_weight = 5
|
|
||||||
ij_php_parameters_attributes_wrap = off
|
|
||||||
ij_php_parentheses_expression_new_line_after_left_paren = false
|
|
||||||
ij_php_parentheses_expression_right_paren_on_new_line = false
|
|
||||||
ij_php_phpdoc_blank_line_before_tags = true
|
|
||||||
ij_php_phpdoc_blank_lines_around_parameters = true
|
|
||||||
ij_php_phpdoc_keep_blank_lines = true
|
|
||||||
ij_php_phpdoc_param_spaces_between_name_and_description = 1
|
|
||||||
ij_php_phpdoc_param_spaces_between_tag_and_type = 1
|
|
||||||
ij_php_phpdoc_param_spaces_between_type_and_name = 1
|
|
||||||
ij_php_phpdoc_use_fqcn = true
|
|
||||||
ij_php_phpdoc_wrap_long_lines = true
|
|
||||||
ij_php_place_assignment_sign_on_next_line = false
|
|
||||||
ij_php_place_parens_for_constructor = 0
|
|
||||||
ij_php_property_read_weight = 28
|
|
||||||
ij_php_property_weight = 28
|
|
||||||
ij_php_property_write_weight = 28
|
|
||||||
ij_php_return_type_on_new_line = false
|
|
||||||
ij_php_return_weight = 6
|
|
||||||
ij_php_see_weight = 3
|
|
||||||
ij_php_since_weight = 28
|
|
||||||
ij_php_sort_phpdoc_elements = true
|
|
||||||
ij_php_space_after_colon = true
|
|
||||||
ij_php_space_after_colon_in_enum_backed_type = true
|
|
||||||
ij_php_space_after_colon_in_named_argument = true
|
|
||||||
ij_php_space_after_colon_in_return_type = true
|
|
||||||
ij_php_space_after_comma = true
|
|
||||||
ij_php_space_after_for_semicolon = true
|
|
||||||
ij_php_space_after_quest = true
|
|
||||||
ij_php_space_after_type_cast = false
|
|
||||||
ij_php_space_after_unary_not = false
|
|
||||||
ij_php_space_before_array_initializer_left_brace = false
|
|
||||||
ij_php_space_before_catch_keyword = true
|
|
||||||
ij_php_space_before_catch_left_brace = true
|
|
||||||
ij_php_space_before_catch_parentheses = true
|
|
||||||
ij_php_space_before_class_left_brace = true
|
|
||||||
ij_php_space_before_closure_left_parenthesis = true
|
|
||||||
ij_php_space_before_colon = true
|
|
||||||
ij_php_space_before_colon_in_enum_backed_type = false
|
|
||||||
ij_php_space_before_colon_in_named_argument = false
|
|
||||||
ij_php_space_before_colon_in_return_type = false
|
|
||||||
ij_php_space_before_comma = false
|
|
||||||
ij_php_space_before_do_left_brace = true
|
|
||||||
ij_php_space_before_else_keyword = true
|
|
||||||
ij_php_space_before_else_left_brace = true
|
|
||||||
ij_php_space_before_finally_keyword = true
|
|
||||||
ij_php_space_before_finally_left_brace = true
|
|
||||||
ij_php_space_before_for_left_brace = true
|
|
||||||
ij_php_space_before_for_parentheses = true
|
|
||||||
ij_php_space_before_for_semicolon = false
|
|
||||||
ij_php_space_before_if_left_brace = true
|
|
||||||
ij_php_space_before_if_parentheses = true
|
|
||||||
ij_php_space_before_method_call_parentheses = false
|
|
||||||
ij_php_space_before_method_left_brace = true
|
|
||||||
ij_php_space_before_method_parentheses = false
|
|
||||||
ij_php_space_before_quest = true
|
|
||||||
ij_php_space_before_short_closure_left_parenthesis = false
|
|
||||||
ij_php_space_before_switch_left_brace = true
|
|
||||||
ij_php_space_before_switch_parentheses = true
|
|
||||||
ij_php_space_before_try_left_brace = true
|
|
||||||
ij_php_space_before_unary_not = false
|
|
||||||
ij_php_space_before_while_keyword = true
|
|
||||||
ij_php_space_before_while_left_brace = true
|
|
||||||
ij_php_space_before_while_parentheses = true
|
|
||||||
ij_php_space_between_ternary_quest_and_colon = false
|
|
||||||
ij_php_spaces_around_additive_operators = true
|
|
||||||
ij_php_spaces_around_arrow = false
|
|
||||||
ij_php_spaces_around_assignment_in_declare = false
|
|
||||||
ij_php_spaces_around_assignment_operators = true
|
|
||||||
ij_php_spaces_around_bitwise_operators = true
|
|
||||||
ij_php_spaces_around_equality_operators = true
|
|
||||||
ij_php_spaces_around_logical_operators = true
|
|
||||||
ij_php_spaces_around_multiplicative_operators = true
|
|
||||||
ij_php_spaces_around_null_coalesce_operator = true
|
|
||||||
ij_php_spaces_around_pipe_in_union_type = false
|
|
||||||
ij_php_spaces_around_relational_operators = true
|
|
||||||
ij_php_spaces_around_shift_operators = true
|
|
||||||
ij_php_spaces_around_unary_operator = false
|
|
||||||
ij_php_spaces_around_var_within_brackets = false
|
|
||||||
ij_php_spaces_within_array_initializer_braces = false
|
|
||||||
ij_php_spaces_within_brackets = false
|
|
||||||
ij_php_spaces_within_catch_parentheses = false
|
|
||||||
ij_php_spaces_within_for_parentheses = false
|
|
||||||
ij_php_spaces_within_if_parentheses = false
|
|
||||||
ij_php_spaces_within_method_call_parentheses = false
|
|
||||||
ij_php_spaces_within_method_parentheses = false
|
|
||||||
ij_php_spaces_within_parentheses = false
|
|
||||||
ij_php_spaces_within_short_echo_tags = true
|
|
||||||
ij_php_spaces_within_switch_parentheses = false
|
|
||||||
ij_php_spaces_within_while_parentheses = false
|
|
||||||
ij_php_special_else_if_treatment = true
|
|
||||||
ij_php_subpackage_weight = 28
|
|
||||||
ij_php_ternary_operation_signs_on_next_line = false
|
|
||||||
ij_php_ternary_operation_wrap = off
|
|
||||||
ij_php_throws_weight = 7
|
|
||||||
ij_php_todo_weight = 28
|
|
||||||
ij_php_unknown_tag_weight = 28
|
|
||||||
ij_php_upper_case_boolean_const = false
|
|
||||||
ij_php_upper_case_null_const = false
|
|
||||||
ij_php_uses_weight = 28
|
|
||||||
ij_php_var_weight = 28
|
|
||||||
ij_php_variable_naming_style = mixed
|
|
||||||
ij_php_version_weight = 28
|
|
||||||
ij_php_while_brace_force = always
|
|
||||||
ij_php_while_on_new_line = false
|
|
||||||
|
|
||||||
[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.stylelintrc,bowerrc,composer.lock,jest.config}]
|
|
||||||
indent_size = 2
|
|
||||||
ij_visual_guides = none
|
|
||||||
ij_json_keep_blank_lines_in_code = 0
|
|
||||||
ij_json_keep_indents_on_empty_lines = false
|
|
||||||
ij_json_keep_line_breaks = true
|
|
||||||
ij_json_space_after_colon = true
|
|
||||||
ij_json_space_after_comma = true
|
|
||||||
ij_json_space_before_colon = true
|
|
||||||
ij_json_space_before_comma = false
|
|
||||||
ij_json_spaces_within_braces = false
|
|
||||||
ij_json_spaces_within_brackets = false
|
|
||||||
ij_json_wrap_long_lines = false
|
|
||||||
|
|
||||||
[{*.htm,*.html,*.sht,*.shtm,*.shtml}]
|
|
||||||
indent_style = tab
|
|
||||||
ij_smart_tabs = true
|
|
||||||
ij_visual_guides = none
|
|
||||||
ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3
|
|
||||||
ij_html_align_attributes = true
|
|
||||||
ij_html_align_text = false
|
|
||||||
ij_html_attribute_wrap = normal
|
|
||||||
ij_html_block_comment_at_first_column = true
|
|
||||||
ij_html_do_not_align_children_of_min_lines = 0
|
|
||||||
ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p
|
|
||||||
ij_html_do_not_indent_children_of_tags = html,body,thead,tbody,tfoot,style,script,head
|
|
||||||
ij_html_enforce_quotes = false
|
|
||||||
ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var
|
|
||||||
ij_html_keep_blank_lines = 2
|
|
||||||
ij_html_keep_indents_on_empty_lines = false
|
|
||||||
ij_html_keep_line_breaks = true
|
|
||||||
ij_html_keep_line_breaks_in_text = true
|
|
||||||
ij_html_keep_whitespaces = false
|
|
||||||
ij_html_keep_whitespaces_inside = span,pre,textarea
|
|
||||||
ij_html_line_comment_at_first_column = true
|
|
||||||
ij_html_new_line_after_last_attribute = never
|
|
||||||
ij_html_new_line_before_first_attribute = never
|
|
||||||
ij_html_quote_style = none
|
|
||||||
ij_html_remove_new_line_before_tags = br
|
|
||||||
ij_html_space_after_tag_name = false
|
|
||||||
ij_html_space_around_equality_in_attribute = false
|
|
||||||
ij_html_space_inside_empty_tag = false
|
|
||||||
ij_html_text_wrap = normal
|
|
||||||
|
|
||||||
[{*.markdown,*.md}]
|
|
||||||
ij_visual_guides = none
|
|
||||||
ij_markdown_force_one_space_after_blockquote_symbol = true
|
|
||||||
ij_markdown_force_one_space_after_header_symbol = true
|
|
||||||
ij_markdown_force_one_space_after_list_bullet = true
|
|
||||||
ij_markdown_force_one_space_between_words = true
|
|
||||||
ij_markdown_keep_indents_on_empty_lines = false
|
|
||||||
ij_markdown_max_lines_around_block_elements = 1
|
|
||||||
ij_markdown_max_lines_around_header = 1
|
|
||||||
ij_markdown_max_lines_between_paragraphs = 1
|
|
||||||
ij_markdown_min_lines_around_block_elements = 1
|
|
||||||
ij_markdown_min_lines_around_header = 1
|
|
||||||
ij_markdown_min_lines_between_paragraphs = 1
|
|
||||||
|
|
||||||
[{*.yaml,*.yml}]
|
|
||||||
indent_size = 2
|
|
||||||
ij_visual_guides = none
|
|
||||||
ij_yaml_align_values_properties = do_not_align
|
|
||||||
ij_yaml_autoinsert_sequence_marker = true
|
|
||||||
ij_yaml_block_mapping_on_new_line = false
|
|
||||||
ij_yaml_indent_sequence_value = true
|
|
||||||
ij_yaml_keep_indents_on_empty_lines = false
|
|
||||||
ij_yaml_keep_line_breaks = true
|
|
||||||
ij_yaml_sequence_on_new_line = false
|
|
||||||
ij_yaml_space_before_colon = false
|
|
||||||
ij_yaml_spaces_within_braces = true
|
|
||||||
ij_yaml_spaces_within_brackets = true
|
|
||||||
48
.gitattributes
vendored
48
.gitattributes
vendored
@@ -1,48 +0,0 @@
|
|||||||
# Set the default behavior, in case people don't have core.autocrlf set.
|
|
||||||
* text=auto
|
|
||||||
|
|
||||||
# Explicitly declare text files you want to always be normalized and converted
|
|
||||||
# to native line endings on checkout.
|
|
||||||
*.bash text eol=lf
|
|
||||||
*.bat text eol=lf
|
|
||||||
*.cmd text eol=lf
|
|
||||||
*.css text eol=lf
|
|
||||||
*.scss text eol=lf
|
|
||||||
*.dist text eol=lf
|
|
||||||
.editorconfig text eol=lf
|
|
||||||
.env* text eol=lf
|
|
||||||
.gitignore text eol=lf
|
|
||||||
.htaccess text eol=lf
|
|
||||||
*.htm text eol=lf
|
|
||||||
*.html text eol=lf
|
|
||||||
*.ini text eol=lf
|
|
||||||
*.js text eol=lf
|
|
||||||
*.json text eol=lf
|
|
||||||
*.lock text eol=lf
|
|
||||||
*.md text eol=lf
|
|
||||||
*.php text eol=lf
|
|
||||||
*.php_cs text eol=lf
|
|
||||||
*.php8 text eol=lf
|
|
||||||
*.plex text eol=lf
|
|
||||||
*.sh text eol=lf
|
|
||||||
*.svg text eol=lf
|
|
||||||
*.ts text eol=lf
|
|
||||||
*.twig text eol=lf
|
|
||||||
*.txt text eol=lf
|
|
||||||
*.xml text eol=lf
|
|
||||||
*.xsd text eol=lf
|
|
||||||
*.yaml text eol=lf
|
|
||||||
*.yml text eol=lf
|
|
||||||
|
|
||||||
# Denote all files that are truly binary and should not be modified.
|
|
||||||
*.png binary
|
|
||||||
*.jpeg binary
|
|
||||||
*.jpg binary
|
|
||||||
*.gif binary
|
|
||||||
*.ico binary
|
|
||||||
*.pdf binary
|
|
||||||
*.swf binary
|
|
||||||
*.zip binary
|
|
||||||
*.ttf binary
|
|
||||||
*.woff binary
|
|
||||||
*.woff2 binary
|
|
||||||
83
.github/pull_request_template.md
vendored
83
.github/pull_request_template.md
vendored
@@ -1,83 +0,0 @@
|
|||||||
<!--
|
|
||||||
|
|
||||||
IMPORTANT: Please follow the guidelines within this PR template before submitting it, it will greatly help us process your PR. 🙏
|
|
||||||
|
|
||||||
Any PRs not following the guidelines or with missing information will not be considered.
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
## Base information
|
|
||||||
| Question | Answer
|
|
||||||
|---------------------------------------------------------------|--------
|
|
||||||
| Related to a SourceForge thead / Another PR / Combodo ticket? | <!-- Put the URL -->
|
|
||||||
| Type of change? | Bug fix / Enhancement / Translations
|
|
||||||
|
|
||||||
|
|
||||||
## Symptom (bug) / Objective (enhancement)
|
|
||||||
<!--
|
|
||||||
If it's a bug
|
|
||||||
- Explain the symptom in details
|
|
||||||
- If possible put error messages, logs or screenshots (you can paste image directly in this editor).
|
|
||||||
|
|
||||||
If it's an enhancement
|
|
||||||
- Describe what is blocking you, what is the objective with as much details as possible.
|
|
||||||
- Add screenshots if it's related to UI.
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
## Reproduction procedure (bug)
|
|
||||||
<!--
|
|
||||||
Remove this section only if it's NOT a bug.
|
|
||||||
|
|
||||||
Otherwise, explain step by step how to reproduce the issue on a standard iTop Community.
|
|
||||||
|
|
||||||
If it requires a custom datamodel, provide the minimal XML delta to reproduce it on a standard iTop Community.
|
|
||||||
-->
|
|
||||||
|
|
||||||
1. On iTop x.y.z <!-- Put complete iTop version (eg. 3.1.0-2) -->
|
|
||||||
2. With PHP x.y.z <!-- Put complete PHP version (eg. 8.1.24) -->
|
|
||||||
2. First go there
|
|
||||||
2. Then do that
|
|
||||||
3. ...
|
|
||||||
4. Finally, see that...
|
|
||||||
|
|
||||||
|
|
||||||
## Cause (bug)
|
|
||||||
<!--
|
|
||||||
Remove this section only if it's NOT a bug.
|
|
||||||
|
|
||||||
Otherwise, explain what is the cause of the issue (where in the code and why)
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
## Proposed solution (bug and enhancement)
|
|
||||||
<!--
|
|
||||||
Explain in details how you are proposing to solve this:
|
|
||||||
- What did you do in the code and why
|
|
||||||
- If you changed something in the UI, put before / after screenshots (you can paste image directly in this editor)
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
## Checklist before requesting a review
|
|
||||||
<!--
|
|
||||||
Don't remove these lines, check them once done.
|
|
||||||
-->
|
|
||||||
- [ ] I have performed a self-review of my code
|
|
||||||
- [ ] I have tested all changes I made on an iTop instance
|
|
||||||
- [ ] I have added a unit test, otherwise I have explained why I couldn't
|
|
||||||
- [ ] Is the PR clear and detailed enough so anyone can understand digging in the code?
|
|
||||||
|
|
||||||
## Checklist of things to do before PR is ready to merge
|
|
||||||
<!--
|
|
||||||
Things that needs to be done in the PR before it can be considered as ready to be merged
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
- Changes requested in the review
|
|
||||||
- Unit test to add
|
|
||||||
- Dictionary entries to translate
|
|
||||||
- ...
|
|
||||||
-->
|
|
||||||
|
|
||||||
- [ ] ...
|
|
||||||
- [ ] ...
|
|
||||||
- [ ] ...
|
|
||||||
43
.github/workflows/action.yml
vendored
43
.github/workflows/action.yml
vendored
@@ -1,43 +0,0 @@
|
|||||||
name: Add PRs to Combodo PRs Dashboard
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
types:
|
|
||||||
- opened
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
add-to-project:
|
|
||||||
name: Add PR to Combodo Project
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Check if author is a member of the organization
|
|
||||||
id: check-membership
|
|
||||||
run: |
|
|
||||||
ORG="Combodo"
|
|
||||||
AUTHOR=$(jq -r .pull_request.user.login "$GITHUB_EVENT_PATH")
|
|
||||||
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: token ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}" \
|
|
||||||
"https://api.github.com/orgs/$ORG/members/$AUTHOR")
|
|
||||||
if [ "$RESPONSE" == "404" ]; then
|
|
||||||
echo "project_url=https://github.com/orgs/Combodo/projects/5" >> $GITHUB_ENV
|
|
||||||
echo "is_member=false" >> $GITHUB_ENV
|
|
||||||
else
|
|
||||||
echo "project_url=https://github.com/orgs/Combodo/projects/4" >> $GITHUB_ENV
|
|
||||||
echo "is_member=true" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Add internal tag if member
|
|
||||||
if: env.is_member == 'true'
|
|
||||||
run: |
|
|
||||||
curl -X POST -H "Authorization: token ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}" \
|
|
||||||
-H "Accept: application/vnd.github.v3+json" \
|
|
||||||
https://api.github.com/repos/Combodo/iTop/issues/${{ github.event.pull_request.number }}/labels \
|
|
||||||
-d '{"labels":["internal"]}'
|
|
||||||
env:
|
|
||||||
is_member: ${{ env.is_member }}
|
|
||||||
|
|
||||||
- name: Add PR to the appropriate project
|
|
||||||
uses: actions/add-to-project@v1.0.2
|
|
||||||
with:
|
|
||||||
project-url: ${{ env.project_url }}
|
|
||||||
github-token: ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}
|
|
||||||
165
.gitignore
vendored
165
.gitignore
vendored
@@ -1,165 +0,0 @@
|
|||||||
|
|
||||||
################################### Temporary ignore rules during 2.8 UI/UX dev - START
|
|
||||||
/css/backoffice/main.css
|
|
||||||
|
|
||||||
# Sass converter
|
|
||||||
/**/.sass-cache/
|
|
||||||
################################### Temporary ignore rules during 2.8 UI/UX dev - END
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# no slash at the end to handle also symlinks
|
|
||||||
/toolkit
|
|
||||||
/env-*
|
|
||||||
|
|
||||||
# maintenance mode (N°2240)
|
|
||||||
/.maintenance
|
|
||||||
|
|
||||||
# composer reserver directory, from sources, populate/update using "composer install"
|
|
||||||
vendor/*
|
|
||||||
tests/*/vendor/*
|
|
||||||
|
|
||||||
# all conf but listing prevention
|
|
||||||
/conf/**
|
|
||||||
!/conf/.htaccess
|
|
||||||
!/conf/index.php
|
|
||||||
!/conf/web.config
|
|
||||||
|
|
||||||
# all datas but listing prevention
|
|
||||||
/data/**
|
|
||||||
!/data/.htaccess
|
|
||||||
!/data/index.php
|
|
||||||
!/data/web.config
|
|
||||||
!/data/exclude.txt
|
|
||||||
!/data/.compilation-symlinks
|
|
||||||
|
|
||||||
# iTop extensions
|
|
||||||
/extensions/**
|
|
||||||
!/extensions/.htaccess
|
|
||||||
!/extensions/readme.txt
|
|
||||||
!/extensions/web.config
|
|
||||||
|
|
||||||
# all logs but listing prevention
|
|
||||||
/log/**
|
|
||||||
!/log/.htaccess
|
|
||||||
!/log/index.php
|
|
||||||
!/log/web.config
|
|
||||||
|
|
||||||
# NPM: `jquery-ui` package is just there for vulnerability scans, so we don't want to version its files (only `jquery-ui-dist` is used within the code base)
|
|
||||||
/node_modules/jquery-ui/**
|
|
||||||
|
|
||||||
# Symfony: Local env file
|
|
||||||
/resources/symfony/.env.local
|
|
||||||
|
|
||||||
# PHPUnit: Cache file, local XML working copies
|
|
||||||
/tests/php-unit-tests/.phpunit.result.cache
|
|
||||||
/tests/php-unit-tests/phpunit.xml
|
|
||||||
/tests/php-unit-tests/postbuild_integration.xml
|
|
||||||
|
|
||||||
|
|
||||||
# Jetbrains
|
|
||||||
/.idea/**
|
|
||||||
!/.idea/IntelliLang.xml
|
|
||||||
|
|
||||||
# doc. generation
|
|
||||||
/.doc/vendor
|
|
||||||
|
|
||||||
|
|
||||||
#phpdocumentor temp file
|
|
||||||
ast.dump
|
|
||||||
|
|
||||||
# CMake
|
|
||||||
cmake-build-*/
|
|
||||||
|
|
||||||
# Mongo Explorer plugin
|
|
||||||
.idea/**/mongoSettings.xml
|
|
||||||
|
|
||||||
# File-based project format
|
|
||||||
*.iws
|
|
||||||
|
|
||||||
# IntelliJ
|
|
||||||
out/
|
|
||||||
|
|
||||||
# mpeltonen/sbt-idea plugin
|
|
||||||
.idea_modules/
|
|
||||||
|
|
||||||
# JIRA plugin
|
|
||||||
atlassian-ide-plugin.xml
|
|
||||||
|
|
||||||
# Cursive Clojure plugin
|
|
||||||
.idea/replstate.xml
|
|
||||||
|
|
||||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
|
||||||
com_crashlytics_export_strings.xml
|
|
||||||
crashlytics.properties
|
|
||||||
crashlytics-build.properties
|
|
||||||
fabric.properties
|
|
||||||
|
|
||||||
# Editor-based Rest Client
|
|
||||||
.idea/httpRequests
|
|
||||||
### Eclipse template
|
|
||||||
|
|
||||||
.metadata
|
|
||||||
tmp/
|
|
||||||
*.tmp
|
|
||||||
*.bak
|
|
||||||
*.swp
|
|
||||||
*~.nib
|
|
||||||
local.properties
|
|
||||||
.settings/
|
|
||||||
.loadpath
|
|
||||||
.recommenders
|
|
||||||
.project
|
|
||||||
|
|
||||||
# External tool builders
|
|
||||||
.externalToolBuilders/
|
|
||||||
|
|
||||||
# Locally stored "Eclipse launch configurations"
|
|
||||||
*.launch
|
|
||||||
|
|
||||||
# PyDev specific (Python IDE for Eclipse)
|
|
||||||
*.pydevproject
|
|
||||||
|
|
||||||
# CDT-specific (C/C++ Development Tooling)
|
|
||||||
.cproject
|
|
||||||
|
|
||||||
# CDT- autotools
|
|
||||||
.autotools
|
|
||||||
|
|
||||||
# Java annotation processor (APT)
|
|
||||||
.factorypath
|
|
||||||
|
|
||||||
# PDT-specific (PHP Development Tools)
|
|
||||||
.buildpath
|
|
||||||
|
|
||||||
# sbteclipse plugin
|
|
||||||
.target
|
|
||||||
|
|
||||||
# Tern plugin
|
|
||||||
.tern-project
|
|
||||||
|
|
||||||
# TeXlipse plugin
|
|
||||||
.texlipse
|
|
||||||
|
|
||||||
# STS (Spring Tool Suite)
|
|
||||||
.springBeans
|
|
||||||
|
|
||||||
# Code Recommenders
|
|
||||||
.recommenders/
|
|
||||||
|
|
||||||
# Annotation Processing
|
|
||||||
.apt_generated/
|
|
||||||
|
|
||||||
# Scala IDE specific (Scala & Java development for Eclipse)
|
|
||||||
.cache-main
|
|
||||||
.scala_dependencies
|
|
||||||
.worksheet
|
|
||||||
|
|
||||||
# Mac
|
|
||||||
.DS_Store
|
|
||||||
|
|
||||||
# Windows
|
|
||||||
Thumbs.db
|
|
||||||
|
|
||||||
15
.idea/IntelliLang.xml
generated
15
.idea/IntelliLang.xml
generated
@@ -1,15 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="LanguageInjectionConfiguration">
|
|
||||||
<injection language="InjectablePHP" injector-id="xml">
|
|
||||||
<display-name>iTop - Class method code</display-name>
|
|
||||||
<place><![CDATA[xmlTag().withLocalName(string().equalTo("code"))]]></place>
|
|
||||||
<xpath-condition>name(..) = 'method' and count(/itop_design) = 1</xpath-condition>
|
|
||||||
</injection>
|
|
||||||
<injection language="InjectablePHP" injector-id="xml">
|
|
||||||
<display-name>iTop - Snippet code</display-name>
|
|
||||||
<place><![CDATA[xmlTag().withLocalName(string().equalTo("snippet"))]]></place>
|
|
||||||
<xpath-condition>name(..) = 'snippets' and count(/itop_design) = 1</xpath-condition>
|
|
||||||
</injection>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
= Make Doc =
|
|
||||||
.make folder is meant to gather tools for releasing process. Maybe other new purposes will come as well....
|
|
||||||
|
|
||||||
== license ==
|
|
||||||
- updateLicenses.php: used to update community-licenses.xml easily based on composer.json files
|
|
||||||
- sortLicenceXml.php: used to sort licenses based on scope + product name
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
<?php
|
|
||||||
$iBeginTime = time();
|
|
||||||
|
|
||||||
chdir(__DIR__);
|
|
||||||
|
|
||||||
$aCommands = [
|
|
||||||
'php composer/rmUnnecessaryFolders.php',
|
|
||||||
'php build/commands/setupCssCompiler.php',
|
|
||||||
// 'bash /tmp/gabuzomeu.sh',
|
|
||||||
];
|
|
||||||
|
|
||||||
$aFailedCommands=[];
|
|
||||||
foreach ($aCommands as $sCommand)
|
|
||||||
{
|
|
||||||
if (!ExecCommand($sCommand))
|
|
||||||
{
|
|
||||||
$aFailedCommands[] = $sCommand;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$iElapsed = time() - $iBeginTime;
|
|
||||||
|
|
||||||
if (count($aFailedCommands))
|
|
||||||
{
|
|
||||||
fwrite(STDERR, "\nafterBuild execution failed! (in {$iElapsed}s)\n");
|
|
||||||
fwrite(STDERR, "List of failling commands:\n - " . implode("\n - ", $aFailedCommands) . "\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
echo "\nDone ({$iElapsed}s)\n";
|
|
||||||
exit(0);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Executes a command and returns an array with exit code, stdout and stderr content
|
|
||||||
*
|
|
||||||
* @param string $cmd - Command to execute
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
function ExecCommand($cmd) {
|
|
||||||
$iBeginTime = time();
|
|
||||||
|
|
||||||
|
|
||||||
echo sprintf("command: %s", str_pad("$cmd ", 50));
|
|
||||||
|
|
||||||
$descriptorspec = array(
|
|
||||||
0 => array("pipe", "r"), // stdin
|
|
||||||
1 => array("pipe", "w"), // stdout
|
|
||||||
2 => array("pipe", "w"), // stderr
|
|
||||||
);
|
|
||||||
$process = proc_open($cmd, $descriptorspec, $pipes, __DIR__ . '/..', null);
|
|
||||||
|
|
||||||
$stdout = stream_get_contents($pipes[1]);
|
|
||||||
fclose($pipes[1]);
|
|
||||||
|
|
||||||
$stderr = stream_get_contents($pipes[2]);
|
|
||||||
fclose($pipes[2]);
|
|
||||||
|
|
||||||
$iCode = proc_close($process);
|
|
||||||
$bSuccess = (0 === $iCode);
|
|
||||||
|
|
||||||
$iElapsed = time() - $iBeginTime;
|
|
||||||
if (!$bSuccess) {
|
|
||||||
fwrite(STDERR, sprintf(
|
|
||||||
"\nCOMMAND FAILED! (%s) \n - status:%s \n - stderr:%s \n - stdout: %s\n - elapsed:%ss\n\n",
|
|
||||||
$cmd,
|
|
||||||
$iCode,
|
|
||||||
rtrim($stderr),
|
|
||||||
rtrim($stdout),
|
|
||||||
$iElapsed
|
|
||||||
));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
echo "| elapsed:{$iElapsed}s \n";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($stderr))
|
|
||||||
{
|
|
||||||
fwrite(STDERR, "$stderr\n");
|
|
||||||
}
|
|
||||||
if (!empty($stdout))
|
|
||||||
{
|
|
||||||
echo "stdout :$stdout\n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
return $bSuccess;
|
|
||||||
}
|
|
||||||
@@ -1,51 +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/>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Combodo\iTop\Composer\iTopComposer;
|
|
||||||
|
|
||||||
$iTopFolder = __DIR__."/../../../";
|
|
||||||
|
|
||||||
require_once("$iTopFolder/approot.inc.php");
|
|
||||||
require_once(APPROOT."/application/utils.inc.php");
|
|
||||||
|
|
||||||
if (PHP_SAPI !== 'cli')
|
|
||||||
{
|
|
||||||
throw new \Exception('This script can only run from CLI');
|
|
||||||
}
|
|
||||||
|
|
||||||
$sCssFile = APPROOT.'/css/setup.css';
|
|
||||||
if (file_exists($sCssFile))
|
|
||||||
{
|
|
||||||
fwrite(STDERR, "$sCssFile already exists (it should not), removing it.");
|
|
||||||
if (!unlink($sCssFile))
|
|
||||||
{
|
|
||||||
fwrite(STDERR, "Failed to remove $sCssFile, exiting.");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$sCssRelPath = utils::GetCSSFromSASS('css/setup.scss');
|
|
||||||
|
|
||||||
if (!file_exists($sCssFile))
|
|
||||||
{
|
|
||||||
fwrite(STDERR, "Failed to compile $sCssFile, exiting.");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
@@ -1,105 +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/>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Alias for `composer show -loD`
|
|
||||||
* You can also use `composer outdated -D`
|
|
||||||
*
|
|
||||||
* @link https://getcomposer.org/doc/03-cli.md#show
|
|
||||||
*/
|
|
||||||
|
|
||||||
$iTopFolder = __DIR__."/../../../";
|
|
||||||
|
|
||||||
require_once("$iTopFolder/approot.inc.php");
|
|
||||||
$sApproot = APPROOT;
|
|
||||||
$aTrace = array();
|
|
||||||
|
|
||||||
$aParamsConfig = array(
|
|
||||||
'composer-path' => array(
|
|
||||||
'default' => 'composer',
|
|
||||||
),
|
|
||||||
);
|
|
||||||
$aParamsConfigNotFound = array_flip(array_keys($aParamsConfig));
|
|
||||||
$aGivenArgs = $argv;
|
|
||||||
unset($aGivenArgs[0]);
|
|
||||||
|
|
||||||
$aParams = array();
|
|
||||||
|
|
||||||
foreach ($aParamsConfig as $sParam => $aConfig)
|
|
||||||
{
|
|
||||||
$bParamsFound = false;
|
|
||||||
foreach ($aGivenArgs as $sGivenArg)
|
|
||||||
{
|
|
||||||
if (preg_match("/--$sParam(?:=(?<value>.*))?$/", $sGivenArg, $aMatches))
|
|
||||||
{
|
|
||||||
$aParams[$sParam] =
|
|
||||||
isset($aMatches['value'])
|
|
||||||
? $aMatches['value']
|
|
||||||
: true
|
|
||||||
;
|
|
||||||
$bParamsFound = true;
|
|
||||||
unset($aGivenArgs[$sGivenArg]);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($bParamsFound)
|
|
||||||
{
|
|
||||||
unset($aParamsConfigNotFound[$sParam]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($aParamsConfigNotFound as $sParamsConfigNotFound => $void)
|
|
||||||
{
|
|
||||||
if (isset($aParamsConfig[$sParamsConfigNotFound]['default']))
|
|
||||||
{
|
|
||||||
$aParams[$sParamsConfigNotFound] = $aParamsConfig[$sParamsConfigNotFound]['default'];
|
|
||||||
$aTrace[] = "\e[1;30mUsing default value '{$aParams[$sParamsConfigNotFound]}' for '$sParamsConfigNotFound'\e[0m\n";
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
die("Missing '$sParamsConfigNotFound'");
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "This command aims at helping you find upgradable dependencies\n";
|
|
||||||
echo "\e[0;33mBeware of the version colored in orange, they probably introduce BC breaks!\e[0m\n";
|
|
||||||
|
|
||||||
$sCommand = "{$aParams['composer-path']} show -loD --working-dir=$sApproot --ansi";
|
|
||||||
$execCode = exec($sCommand, $output);
|
|
||||||
$sOutput = implode("\n", $output)."\n";
|
|
||||||
|
|
||||||
if (!$execCode)
|
|
||||||
{
|
|
||||||
echo "\e[41mFailed to execute '$sCommand'\e[0m\n";
|
|
||||||
echo "Trace: \n".implode("\n", $aTrace);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$iCountDepdendenciesFound = count($output);
|
|
||||||
|
|
||||||
$iCountBc = substr_count($sOutput, '[33m');
|
|
||||||
|
|
||||||
echo sprintf("Found \033[44m%d\033[0m upgradable dependencies, including \e[41m%s BC break\e[0m 😱 :\n\n", $iCountDepdendenciesFound, $iCountBc);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
echo $sOutput;
|
|
||||||
|
|
||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -1,56 +0,0 @@
|
|||||||
courier.php
|
|
||||||
courierb.php
|
|
||||||
courierbi.php
|
|
||||||
courieri.php
|
|
||||||
dejavusans.ctg.z
|
|
||||||
dejavusans.php
|
|
||||||
dejavusans.z
|
|
||||||
dejavusansb.ctg.z
|
|
||||||
dejavusansb.php
|
|
||||||
dejavusansb.z
|
|
||||||
dejavusansbi.ctg.z
|
|
||||||
dejavusansbi.php
|
|
||||||
dejavusansbi.z
|
|
||||||
dejavusanscondensed.ctg.z
|
|
||||||
dejavusanscondensed.php
|
|
||||||
dejavusanscondensed.z
|
|
||||||
dejavusanscondensedb.ctg.z
|
|
||||||
dejavusanscondensedb.php
|
|
||||||
dejavusanscondensedb.z
|
|
||||||
dejavusanscondensedbi.ctg.z
|
|
||||||
dejavusanscondensedbi.php
|
|
||||||
dejavusanscondensedbi.z
|
|
||||||
dejavusanscondensedi.ctg.z
|
|
||||||
dejavusanscondensedi.php
|
|
||||||
dejavusanscondensedi.z
|
|
||||||
dejavusansextralight.ctg.z
|
|
||||||
dejavusansextralight.php
|
|
||||||
dejavusansextralight.z
|
|
||||||
dejavusansi.ctg.z
|
|
||||||
dejavusansi.php
|
|
||||||
dejavusansi.z
|
|
||||||
dejavusansmono.ctg.z
|
|
||||||
dejavusansmono.php
|
|
||||||
dejavusansmono.z
|
|
||||||
dejavusansmonob.ctg.z
|
|
||||||
dejavusansmonob.php
|
|
||||||
dejavusansmonob.z
|
|
||||||
dejavusansmonobi.ctg.z
|
|
||||||
dejavusansmonobi.php
|
|
||||||
dejavusansmonobi.z
|
|
||||||
dejavusansmonoi.ctg.z
|
|
||||||
dejavusansmonoi.php
|
|
||||||
dejavusansmonoi.z
|
|
||||||
droidsansfallback.ctg.z
|
|
||||||
droidsansfallback.php
|
|
||||||
droidsansfallback.z
|
|
||||||
helvetica.php
|
|
||||||
helveticab.php
|
|
||||||
helveticabi.php
|
|
||||||
helveticai.php
|
|
||||||
symbol.php
|
|
||||||
times.php
|
|
||||||
timesb.php
|
|
||||||
timesbi.php
|
|
||||||
timesi.php
|
|
||||||
zapfdingbats.php
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* This script will copy custom fonts in the TCPDF lib fonts directory.
|
|
||||||
* If you need to add other files :
|
|
||||||
* - add the corresponding files in this script directory
|
|
||||||
* - modify this script to copy also your files
|
|
||||||
*
|
|
||||||
* @since 2.7.0 N°1947 add DroidSansFallback font (see also PR #49 in the links below)
|
|
||||||
* @since 2.7.0 N°2435 TCPPDF lib forked and added in composer.json (at that time the lib was announced as deprecated and rewritten in tecnickcom/tc-lib-pdf)
|
|
||||||
* @since 3.2.0 N°7175 switch back to TCPDF original lib (which is finally still maintained, tecnickcom/tc-lib-pdf us still under dev), script creation to keep custom DroidSansFallback font
|
|
||||||
*
|
|
||||||
* @link https://github.com/Combodo/iTop/pull/49 add DroidSansFallback font
|
|
||||||
* @link https://github.com/tecnickcom/TCPDF?tab=readme-ov-file#note TCPDF is in support only mode
|
|
||||||
*/
|
|
||||||
|
|
||||||
$sItopRootFolder = realpath(__DIR__ . "/../../../../");
|
|
||||||
$sCurrentScriptFileName = basename(__FILE__);
|
|
||||||
|
|
||||||
|
|
||||||
require_once ("$sItopRootFolder/lib/autoload.php");
|
|
||||||
|
|
||||||
|
|
||||||
$sTcPdfRootFolder = $sItopRootFolder.'/lib/tecnickcom/tcpdf';
|
|
||||||
if (false === file_exists($sTcPdfRootFolder)) {
|
|
||||||
echo $sCurrentScriptFileName.": No TCPDF lib detected, exiting !\n";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$sTcPdfFontsFolder = $sTcPdfRootFolder.'/fonts/';
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 1) Cleaning up the fonts directory to keep only the ones we want in iTop
|
|
||||||
*/
|
|
||||||
echo $sCurrentScriptFileName.": ---1) Cleaning up the fonts files\n";
|
|
||||||
$aTcpdfDefaultFontsToKeepInItop = file(__DIR__.'/tcpdfDefaultFontsToKeepInItop.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
|
||||||
|
|
||||||
$aTcpdfFontsDirContent = scandir($sTcPdfFontsFolder);
|
|
||||||
foreach ($aTcpdfFontsDirContent as $sTcpdfFontResourceName) {
|
|
||||||
if ($sTcpdfFontResourceName === '.') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if ($sTcpdfFontResourceName === '..') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!in_array($sTcpdfFontResourceName, $aTcpdfDefaultFontsToKeepInItop, true)) {
|
|
||||||
echo $sCurrentScriptFileName.": Removing $sTcpdfFontResourceName !\n";
|
|
||||||
|
|
||||||
$sTcpdfFontResourceFullPath = $sTcPdfFontsFolder.$sTcpdfFontResourceName;
|
|
||||||
if (is_file($sTcpdfFontResourceFullPath)) {
|
|
||||||
unlink($sTcpdfFontResourceFullPath);
|
|
||||||
} elseif (is_dir($sTcpdfFontResourceFullPath)) {
|
|
||||||
rrmdir($sTcpdfFontResourceFullPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 2) Then adding the DroidSansFallback font (useful for CJK data for example)
|
|
||||||
*/
|
|
||||||
echo $sCurrentScriptFileName.": ---2) Copying font files to TCPDF ($sTcPdfFontsFolder)...\n";
|
|
||||||
$aFontFilesToCopy = glob(__DIR__.'\droidsansfallback.*');
|
|
||||||
foreach ($aFontFilesToCopy as $sFontFileToCopy) {
|
|
||||||
$sFontFileName = basename($sFontFileToCopy);
|
|
||||||
echo $sCurrentScriptFileName.': copying '.$sFontFileName."\n";
|
|
||||||
copy($sFontFileToCopy, $sTcPdfFontsFolder.$sFontFileName);
|
|
||||||
}
|
|
||||||
echo $sCurrentScriptFileName.": Done !\n";
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Recursively delete a directory and its content
|
|
||||||
*
|
|
||||||
* @param $sDirToRemovePath
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
function rrmdir($sDirToRemovePath):void
|
|
||||||
{
|
|
||||||
if (is_dir($sDirToRemovePath)) {
|
|
||||||
$objects = scandir($sDirToRemovePath);
|
|
||||||
foreach ($objects as $object) {
|
|
||||||
if ($object != "." && $object != "..") {
|
|
||||||
if (filetype($sDirToRemovePath."/".$object) == "dir") {
|
|
||||||
rrmdir($sDirToRemovePath."/".$object);
|
|
||||||
} else {
|
|
||||||
unlink($sDirToRemovePath."/".$object);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
reset($objects);
|
|
||||||
rmdir($sDirToRemovePath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +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/>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ensure that the files for folder browsing protection (.htaccess, web.config) are kept after an "npm install/update" command
|
|
||||||
*/
|
|
||||||
|
|
||||||
$iTopFolder = __DIR__."/../../../";
|
|
||||||
|
|
||||||
require_once("$iTopFolder/approot.inc.php");
|
|
||||||
|
|
||||||
$sDependenciesRootFolderAbsPath = APPROOT . "node_modules/";
|
|
||||||
$aFilesToCheck = [
|
|
||||||
".htaccess",
|
|
||||||
"web.config",
|
|
||||||
];
|
|
||||||
|
|
||||||
echo "This command aims at ensuring that folder browsing protection files (.htaccess, web.config) are present in the dependencies folder even after an install/upgrade command\n";
|
|
||||||
echo "Checking files:\n";
|
|
||||||
|
|
||||||
foreach($aFilesToCheck as $sFileToCheck) {
|
|
||||||
if (file_exists($sDependenciesRootFolderAbsPath . $sFileToCheck)) {
|
|
||||||
echo "✔️ $sFileToCheck is present\n";
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If missing, copy the one from /lib as it contains the necessary allow/deny directives for third-parties
|
|
||||||
copy(APPROOT . "lib/$sFileToCheck", $sDependenciesRootFolderAbsPath . $sFileToCheck);
|
|
||||||
echo "✔️ $sFileToCheck was missing and has been re-created\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure separation with following scripts
|
|
||||||
echo "\n";
|
|
||||||
@@ -1,100 +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/>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
$iTopFolder = __DIR__ . "/../../" ;
|
|
||||||
|
|
||||||
require_once ("$iTopFolder/approot.inc.php");
|
|
||||||
require_once (APPROOT."/setup/setuputils.class.inc.php");
|
|
||||||
|
|
||||||
if (php_sapi_name() !== 'cli')
|
|
||||||
{
|
|
||||||
throw new \Exception('This script can only run from CLI');
|
|
||||||
}
|
|
||||||
|
|
||||||
clearstatcache();
|
|
||||||
|
|
||||||
// Read params
|
|
||||||
$key = array_search("--manager", $argv);
|
|
||||||
if (false === $key || false === isset($argv[$key + 1]) ) {
|
|
||||||
throw new \InvalidArgumentException("Usage: " . __FILE__ . " --manager composer|npm");
|
|
||||||
}
|
|
||||||
$sDependenciesHandlerCode = $argv[$key + 1];
|
|
||||||
|
|
||||||
switch ($sDependenciesHandlerCode) {
|
|
||||||
case "composer":
|
|
||||||
$sDependenciesHandlerFQCN = \Combodo\iTop\Dependencies\Composer\iTopComposer::class;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "npm":
|
|
||||||
$sDependenciesHandlerFQCN = \Combodo\iTop\Dependencies\NPM\iTopNPM::class;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new \Exception("Invalid dependencies handler code, $sDependenciesHandlerCode given, expected composer|npm");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start handler
|
|
||||||
$oDependenciesHandler = new $sDependenciesHandlerFQCN();
|
|
||||||
$aDeniedButStillPresent = $oDependenciesHandler->ListDeniedButStillPresentFilesAbsPaths();
|
|
||||||
|
|
||||||
echo "\n";
|
|
||||||
foreach ($aDeniedButStillPresent as $sDir)
|
|
||||||
{
|
|
||||||
if (false === $oDependenciesHandler::IsQuestionnableFile($sDir))
|
|
||||||
{
|
|
||||||
echo "ERROR found INVALID denied test dir: '$sDir'\n";
|
|
||||||
throw new \RuntimeException("$sDir is in the denied list but doesn't comply with the rule (see IsQuestionnableFolder method)");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (false === file_exists($sDir)) {
|
|
||||||
echo "INFO $sDir is in denied list, but not existing on disk => skipping !\n";
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
if(is_dir($sDir)){
|
|
||||||
SetupUtils::rrmdir($sDir);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
unlink($sDir);
|
|
||||||
}
|
|
||||||
echo "✔️ Remove denied test dir: '$sDir'\n";
|
|
||||||
}
|
|
||||||
catch (\Exception $e) {
|
|
||||||
echo "\n❌ FAILED to remove denied test dir: '$sDir'\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$aAllowedAndDeniedDirs = array_merge(
|
|
||||||
$oDependenciesHandler->ListAllowedFilesAbsPaths(),
|
|
||||||
$oDependenciesHandler->ListDeniedFilesAbsPaths()
|
|
||||||
);
|
|
||||||
$aExistingDirs = $oDependenciesHandler->ListAllFilesAbsPaths();
|
|
||||||
$aMissing = array_diff($aExistingDirs, $aAllowedAndDeniedDirs);
|
|
||||||
if (false === empty($aMissing)) {
|
|
||||||
echo "Some new tests dirs exists !\n"
|
|
||||||
." They must be declared either in the allowed or denied list in {$sDependenciesHandlerFQCN}\n"
|
|
||||||
.' List of dirs:'."\n".var_export($aMissing, true)."\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure separation with following scripts
|
|
||||||
echo "\n";
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
# Git hooks for iTop
|
|
||||||
|
|
||||||
## ❓ Goal
|
|
||||||
|
|
||||||
Those [git hooks](https://git-scm.com/docs/githooks) aims to ease developing on [iTop](https://github.com/Combodo/iTop).
|
|
||||||
|
|
||||||
## ☑ Available hooks
|
|
||||||
|
|
||||||
* pre-commit : rejects commit if you have at least one SCSS file staged, and no CSS file
|
|
||||||
|
|
||||||
## ⚙ Install
|
|
||||||
|
|
||||||
Just run install.php !
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<?php
|
|
||||||
$aHooks = [
|
|
||||||
'pre-commit.php',
|
|
||||||
];
|
|
||||||
|
|
||||||
$sAppRoot = dirname(__DIR__, 2);
|
|
||||||
|
|
||||||
|
|
||||||
foreach ($aHooks as $sSourceHookFileName) {
|
|
||||||
echo "Processing for `{$sSourceHookFileName}`...\n";
|
|
||||||
$sSourceHookPath = __DIR__.DIRECTORY_SEPARATOR.$sSourceHookFileName;
|
|
||||||
|
|
||||||
$aPathParts = pathinfo($sSourceHookFileName);
|
|
||||||
$sTargetHookPath = $sAppRoot.DIRECTORY_SEPARATOR.'.git'.DIRECTORY_SEPARATOR.'hooks'.DIRECTORY_SEPARATOR.$aPathParts['filename'];
|
|
||||||
|
|
||||||
if (file_exists($sTargetHookPath) || is_link($sTargetHookPath)) {
|
|
||||||
echo "Existing $sTargetHookPath ! Removing...";
|
|
||||||
unlink($sTargetHookPath);
|
|
||||||
echo "OK !\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "Creating symlink for hook in $sTargetHookPath...";
|
|
||||||
symlink($sSourceHookPath, $sTargetHookPath);
|
|
||||||
echo "OK !\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
#!/usr/bin/php
|
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* Reject any commit containing .scss files, but no .css file !
|
|
||||||
*/
|
|
||||||
|
|
||||||
echo "Checking files staged...\n";
|
|
||||||
$sFilesToCommit = shell_exec('git diff --cached --name-only --diff-filter=ACMRT');
|
|
||||||
$aFilesToCommit = explode("\n", $sFilesToCommit);
|
|
||||||
|
|
||||||
$aScssFiles = GetFilesWithExtension('scss', $aFilesToCommit);
|
|
||||||
if (count($aScssFiles) === 0) {
|
|
||||||
echo "No scss file : OK to go !\n";
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
$aCssFiles = GetFilesWithExtension('css', $aFilesToCommit);
|
|
||||||
if (count($aCssFiles) === 0) {
|
|
||||||
echo "There are SCSS files staged but no CSS file : REJECTING commit.\n";
|
|
||||||
echo "You must add the compiled SCSS files by running the setup !\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "We have SCSS but also CSS => OK to commit !\n";
|
|
||||||
exit(0);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function GetFilesWithExtension($sExtension, $aFiles) {
|
|
||||||
return array_filter(
|
|
||||||
$aFiles,
|
|
||||||
function($item) use ($sExtension) {
|
|
||||||
return (endsWith($item, '.'.$sExtension));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function endsWith( $haystack, $needle ) {
|
|
||||||
$length = strlen( $needle );
|
|
||||||
if( !$length ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return substr( $haystack, -$length ) === $needle;
|
|
||||||
}
|
|
||||||
|
|
||||||
function exitWithMessage($sMessage, $iCode) {
|
|
||||||
echo $sMessage;
|
|
||||||
exit($iCode);
|
|
||||||
}
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
#/bin/bash
|
|
||||||
|
|
||||||
#git diff --name-status 2.6.2..HEAD js |grep 'A\sjs/' |awk -F/ '{printf("lib/%s/%s\n",$2,$3)}'|sort |uniq >/tmp/toto
|
|
||||||
#git diff --name-status 2.6.2..HEAD lib |grep 'A\slib/' |awk -F/ '{printf("lib/%s/%s\n",$2,$3)}'|sort |uniq >/tmp/toto
|
|
||||||
|
|
||||||
function HELP(){
|
|
||||||
echo " Syntax: bash $0 /var/www/html/iTop"
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ $# -eq 0 ]
|
|
||||||
then
|
|
||||||
echo "no iTop path provided"
|
|
||||||
HELP
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
iTopPath=$1
|
|
||||||
|
|
||||||
if [ ! -d $iTopPath ]
|
|
||||||
then
|
|
||||||
echo "$iTopPath is not an iTop path."
|
|
||||||
HELP
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "<?xml version=\"1.0\"?>
|
|
||||||
<licenses>"
|
|
||||||
|
|
||||||
for subfolder in lib datamodels
|
|
||||||
do
|
|
||||||
for l in $(find $iTopPath/$subfolder/ -name composer.json|sed 's|/composer.json||')
|
|
||||||
do
|
|
||||||
if [ ! -d $l ]
|
|
||||||
then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if [ "$subfolder" == "datamodels" ]
|
|
||||||
then
|
|
||||||
if [ $(find $l -name module*.php|wc -l) -ne 0 -o $(echo "$l"|grep -c "itop-portal-base") -ne 0 ]
|
|
||||||
then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
dir=$(dirname $(dirname $l))
|
|
||||||
prod=$(echo $l| sed "s|$dir/||1")
|
|
||||||
echo $l $subfolder
|
|
||||||
lictype=$(cd $l && composer licenses --format json |jq .license[] |sed 's|\"||g')
|
|
||||||
|
|
||||||
authors=""
|
|
||||||
if [ -f $l/composer.json ]
|
|
||||||
then
|
|
||||||
author_nb=$(grep -c authors $l/composer.json|sed 's| ||g')
|
|
||||||
if [ "x$author_nb" != "x0" ]
|
|
||||||
then
|
|
||||||
OLDIFS=$IFS
|
|
||||||
IFS=$'\n'
|
|
||||||
for a in $(cat $l/composer.json |jq .authors[].name|sed 's|\"||g')
|
|
||||||
do
|
|
||||||
authors="$authors$a - "
|
|
||||||
done
|
|
||||||
authors="$authors#"
|
|
||||||
authors=$(echo $authors |sed 's| - #||')
|
|
||||||
IFS=$OLDIFS
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
lic=""
|
|
||||||
for licf in $(find $l -name LICEN*)
|
|
||||||
do
|
|
||||||
lic=$(cat $licf)
|
|
||||||
break
|
|
||||||
done
|
|
||||||
|
|
||||||
#if [ "x$lic" == "x" ]
|
|
||||||
#then
|
|
||||||
# echo "============== no license found $l"
|
|
||||||
#fi
|
|
||||||
|
|
||||||
echo " <license>
|
|
||||||
<product scope=\"$subfolder\">$prod</product>
|
|
||||||
<author>$authors</author>
|
|
||||||
<license_type>$lictype</license_type>
|
|
||||||
<text><![CDATA[
|
|
||||||
$lic
|
|
||||||
]]></text>
|
|
||||||
</license>"
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "</licenses>"
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* script used to sort license file (usefull for autogeneration)
|
|
||||||
* Example:
|
|
||||||
*/
|
|
||||||
$iTopFolder = __DIR__ . "/../../" ;
|
|
||||||
$xmlFilePath = $iTopFolder . "setup/licenses/community-licenses.xml";
|
|
||||||
$dom = new DOMDocument();
|
|
||||||
$dom->load($xmlFilePath);
|
|
||||||
$xp = new DOMXPath($dom);
|
|
||||||
|
|
||||||
$licenseList = $xp->query('/licenses/license');
|
|
||||||
$licenses = iterator_to_array($licenseList);
|
|
||||||
|
|
||||||
|
|
||||||
function get_scope($product_node)
|
|
||||||
{
|
|
||||||
$scope = $product_node->getAttribute("scope");
|
|
||||||
|
|
||||||
if ($scope === "")
|
|
||||||
{ //put iTop first
|
|
||||||
return "aaaaaaaaa";
|
|
||||||
}
|
|
||||||
return $scope;
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_product_node($license_node)
|
|
||||||
{
|
|
||||||
foreach ($license_node->childNodes as $child)
|
|
||||||
{
|
|
||||||
if (is_a($child, 'DomElement') && $child->tagName === "product")
|
|
||||||
{
|
|
||||||
return $child;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function sort_by_product($a, $b)
|
|
||||||
{
|
|
||||||
$aProductNode = get_product_node($a);
|
|
||||||
$bProductNode = get_product_node($b);
|
|
||||||
|
|
||||||
$res = strcmp(get_scope($aProductNode), get_scope($bProductNode));
|
|
||||||
if ($res !== 0)
|
|
||||||
{
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
//sort on node product name
|
|
||||||
return strcmp($aProductNode->nodeValue, $bProductNode->nodeValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
usort($licenses, 'sort_by_product');
|
|
||||||
|
|
||||||
$newdom = new DOMDocument("1.0");
|
|
||||||
$newdom->formatOutput = true;
|
|
||||||
$root = $newdom->createElement("licenses");
|
|
||||||
$newdom->appendChild($root);
|
|
||||||
foreach ($licenses as $b) {
|
|
||||||
$node = $newdom->importNode($b,true);
|
|
||||||
$root->appendChild($newdom->importNode($b,true));
|
|
||||||
}
|
|
||||||
|
|
||||||
$newdom->save($xmlFilePath);
|
|
||||||
@@ -1,155 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* script used to sort license file (useful for autogeneration)
|
|
||||||
*
|
|
||||||
* Requirements :
|
|
||||||
* * bash (on Windows, use Git Bash)
|
|
||||||
* * composer (if you use the phar version, mind to create a `Composer` alias !)
|
|
||||||
* * JQ command
|
|
||||||
* to install on Windows :
|
|
||||||
* `curl -L -o /usr/bin/jq.exe https://github.com/stedolan/jq/releases/latest/download/jq-win64.exe`
|
|
||||||
* this is a Windows port : https://stedolan.github.io/jq/
|
|
||||||
*
|
|
||||||
* Licenses sources :
|
|
||||||
* * `composer licenses --format json` (see https://getcomposer.org/doc/03-cli.md#licenses)
|
|
||||||
* * keep every existing nodes with `/licenses/license[11]/product/@scope` not in ['lib', 'datamodels']
|
|
||||||
* ⚠ If licenses were added manually, they might be removed by this tool ! Be very careful to check for the result before pushing !
|
|
||||||
*
|
|
||||||
* To launch, check requirements and run `php updateLicenses.php`
|
|
||||||
* The target license file path is in `$xmlFilePath`
|
|
||||||
*/
|
|
||||||
|
|
||||||
$iTopFolder = __DIR__."/../../";
|
|
||||||
$xmlFilePath = $iTopFolder."setup/licenses/community-licenses.xml";
|
|
||||||
|
|
||||||
$jqExec = shell_exec("jq -V"); // a param is mandatory otherwise the script will freeze
|
|
||||||
if ((null === $jqExec) || (false === $jqExec)) {
|
|
||||||
echo "/!\ JQ is required but cannot be launched :( \n";
|
|
||||||
echo "Check this script PHPDoc block for instructions\n";
|
|
||||||
die(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function get_scope($product_node) {
|
|
||||||
$scope = $product_node->getAttribute("scope");
|
|
||||||
|
|
||||||
if ($scope === "") { //put iTop first
|
|
||||||
return "aaaaaaaaa";
|
|
||||||
}
|
|
||||||
|
|
||||||
return $scope;
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_product_node($license_node)
|
|
||||||
{
|
|
||||||
foreach ($license_node->childNodes as $child)
|
|
||||||
{
|
|
||||||
if (is_a($child, 'DomElement') && $child->tagName === "product")
|
|
||||||
{
|
|
||||||
return $child;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function sort_by_product($a, $b)
|
|
||||||
{
|
|
||||||
$aProductNode = get_product_node($a);
|
|
||||||
$bProductNode = get_product_node($b);
|
|
||||||
|
|
||||||
$res = strcmp(get_scope($aProductNode), get_scope($bProductNode));
|
|
||||||
if ($res !== 0)
|
|
||||||
{
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
//sort on node product name
|
|
||||||
return strcmp($aProductNode->nodeValue, $bProductNode->nodeValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_license_nodes($file_path)
|
|
||||||
{
|
|
||||||
$dom = new DOMDocument();
|
|
||||||
$dom->load($file_path);
|
|
||||||
$xp = new DOMXPath($dom);
|
|
||||||
|
|
||||||
$licenseList = $xp->query('/licenses/license');
|
|
||||||
$licenses = iterator_to_array($licenseList);
|
|
||||||
|
|
||||||
usort($licenses, 'sort_by_product');
|
|
||||||
|
|
||||||
return $licenses;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @noinspection SuspiciousAssignmentsInspection */
|
|
||||||
function fix_product_name(DOMNode &$oProductNode)
|
|
||||||
{
|
|
||||||
$sProductNameOrig = $oProductNode->nodeValue;
|
|
||||||
|
|
||||||
// sample : `C:\Dev\wamp64\www\itop-27\.make\license/../..//lib/symfony/polyfill-ctype`
|
|
||||||
$sProductNameFixed = remove_dir_from_string($sProductNameOrig, 'lib/');
|
|
||||||
|
|
||||||
// sample : `C:\Dev\wamp64\www\itop-27\.make\license/../..//datamodels/2.x/authent-cas/vendor/apereo/phpcas`
|
|
||||||
$sProductNameFixed = remove_dir_from_string($sProductNameFixed, 'vendor/');
|
|
||||||
|
|
||||||
$oProductNode->nodeValue = $sProductNameFixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
function remove_dir_from_string($sString, $sNeedle)
|
|
||||||
{
|
|
||||||
if (strpos($sString, $sNeedle) === false) {
|
|
||||||
return $sString;
|
|
||||||
}
|
|
||||||
|
|
||||||
$sStringTmp = strstr($sString, $sNeedle);
|
|
||||||
$sStringFixed = str_replace($sNeedle, '', $sStringTmp);
|
|
||||||
|
|
||||||
// DEBUG trace O:)
|
|
||||||
// echo "$sNeedle = $sString => $sStringFixed\n";
|
|
||||||
|
|
||||||
return $sStringFixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
$old_licenses = get_license_nodes($xmlFilePath);
|
|
||||||
|
|
||||||
//generate file with updated licenses
|
|
||||||
$generated_license_file_path = __DIR__."/provfile.xml";
|
|
||||||
echo "- Generating licences...";
|
|
||||||
exec("bash ".__DIR__."/gen-community-license.sh $iTopFolder > ".$generated_license_file_path);
|
|
||||||
echo "OK!\n";
|
|
||||||
|
|
||||||
echo "- Get licenses nodes...";
|
|
||||||
$new_licenses = get_license_nodes($generated_license_file_path);
|
|
||||||
unlink($generated_license_file_path);
|
|
||||||
|
|
||||||
foreach ($old_licenses as $b) {
|
|
||||||
$aProductNode = get_product_node($b);
|
|
||||||
|
|
||||||
if (get_scope($aProductNode) !== "lib" && get_scope($aProductNode) !== "datamodels") {
|
|
||||||
$new_licenses[] = $b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
usort($new_licenses, 'sort_by_product');
|
|
||||||
echo "OK!\n";
|
|
||||||
|
|
||||||
echo "- Overwritting Combodo license file...";
|
|
||||||
$new_dom = new DOMDocument("1.0");
|
|
||||||
$new_dom->formatOutput = true;
|
|
||||||
$root = $new_dom->createElement("licenses");
|
|
||||||
$new_dom->appendChild($root);
|
|
||||||
|
|
||||||
foreach ($new_licenses as $b) {
|
|
||||||
$node = $new_dom->importNode($b, true);
|
|
||||||
|
|
||||||
// N°3870 fix when running script in Windows
|
|
||||||
// fix should be in gen-community-license.sh but it is easier to do it here !
|
|
||||||
if (strncasecmp(PHP_OS, 'WIN', 3) === 0) {
|
|
||||||
$oProductNodeOrig = get_product_node($node);
|
|
||||||
fix_product_name($oProductNodeOrig);
|
|
||||||
}
|
|
||||||
|
|
||||||
$root->appendChild($node);
|
|
||||||
}
|
|
||||||
|
|
||||||
$new_dom->save($xmlFilePath);
|
|
||||||
echo "OK!\n";
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Usage :
|
|
||||||
* `php changelog.php 2.7.4`
|
|
||||||
*
|
|
||||||
* As argument is passed the git ref (tag name or sha1) we want to use as reference
|
|
||||||
*
|
|
||||||
* Outputs :
|
|
||||||
*
|
|
||||||
* 1. List of bugs as CSV :
|
|
||||||
* bug ref;link
|
|
||||||
* Example :
|
|
||||||
* <code>
|
|
||||||
* Bug_ref;Bug_URL;sha1
|
|
||||||
* 1234;https://support.combodo.com/pages/UI.php?operation=details&class=Bug&id=1234;949b213f9|b1ca1f263|a1271da74
|
|
||||||
* </code>
|
|
||||||
*
|
|
||||||
* 2. List of commits sha1/message without bug ref
|
|
||||||
* Example :
|
|
||||||
* <code>
|
|
||||||
* sha1;subject
|
|
||||||
* a6aa183e2;:bookmark: Prepare 2.7.5
|
|
||||||
* </code>
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
if (count($argv) === 1) {
|
|
||||||
echo "⚠ You must pass the base tag/sha1 as parameter\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
$sBaseReference = $argv[1];
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace the Github emojis codes by their UTF-8 character equivalent
|
|
||||||
*/
|
|
||||||
function ReplaceGitmojis(string $sLine)
|
|
||||||
{
|
|
||||||
static $aGitmojis = null;
|
|
||||||
|
|
||||||
if ($aGitmojis === null) {
|
|
||||||
$aRawGitmojis = json_decode(trim(file_get_contents(__DIR__.'/gitmojis.json')), true);
|
|
||||||
if ($aRawGitmojis === false) {
|
|
||||||
echo "\nFailed to parse ".__DIR__."/gitmojis.json, emoji codes will not be replaced by their unicode equivalent.\n";
|
|
||||||
} else {
|
|
||||||
foreach($aRawGitmojis["gitmojis"] as $aGitmoji) {
|
|
||||||
$aGitmojis[$aGitmoji['code']] = $aGitmoji['emoji'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (is_array($aGitmojis)) {
|
|
||||||
return str_replace(array_keys($aGitmojis), array_values($aGitmojis), $sLine);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--- Get log
|
|
||||||
$sGitLogCommand = 'git log --decorate --pretty="%h;%s" --date-order --no-merges '.$sBaseReference.'..HEAD';
|
|
||||||
$sGitLogRaw = shell_exec($sGitLogCommand);
|
|
||||||
|
|
||||||
|
|
||||||
//--- Analyze log
|
|
||||||
$aGitLogLines = preg_split('/\n/', trim($sGitLogRaw));;
|
|
||||||
$aLogLinesWithBugRef = [];
|
|
||||||
$aLogLineNoBug = [];
|
|
||||||
foreach ($aGitLogLines as $sLogLine) {
|
|
||||||
$sBugRef = preg_match('/[nN]°(\d{3,4})/', $sLogLine, $aLineBugRef);
|
|
||||||
if (($sBugRef === false) || empty($aLineBugRef)) {
|
|
||||||
$aLogLineNoBug[] = $sLogLine;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$iBugId = $aLineBugRef[1];
|
|
||||||
$sSha = substr($sLogLine, 0, 9);
|
|
||||||
|
|
||||||
if (array_key_exists($iBugId, $aLogLinesWithBugRef)) {
|
|
||||||
$aBugShaRefs = $aLogLinesWithBugRef[$iBugId];
|
|
||||||
$aBugShaRefs[] = $sSha;
|
|
||||||
$aLogLinesWithBugRef[$iBugId] = $aBugShaRefs;
|
|
||||||
} else {
|
|
||||||
$aLogLinesWithBugRef[$iBugId] = [$sSha];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$aBugsList = array_keys($aLogLinesWithBugRef);
|
|
||||||
sort($aBugsList, SORT_NUMERIC);
|
|
||||||
|
|
||||||
|
|
||||||
//-- Output results
|
|
||||||
echo "# Bugs included\n";
|
|
||||||
echo "Bug_ref;Bug_URL;sha1\n";
|
|
||||||
foreach ($aBugsList as $sBugRef) {
|
|
||||||
$sShaRefs = implode('|', $aLogLinesWithBugRef[$sBugRef]);
|
|
||||||
echo "{$sBugRef};https://support.combodo.com/pages/UI.php?operation=details&class=Bug&id={$sBugRef};$sShaRefs\n";
|
|
||||||
}
|
|
||||||
echo "\n";
|
|
||||||
echo "# Logs line without bug referenced\n";
|
|
||||||
echo "sha1;subject\n";
|
|
||||||
foreach ($aLogLineNoBug as $sLogLine) {
|
|
||||||
echo ReplaceGitmojis($sLogLine)."\n";
|
|
||||||
}
|
|
||||||
@@ -1,589 +0,0 @@
|
|||||||
{
|
|
||||||
"$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
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Tool to automate version update before release
|
|
||||||
*
|
|
||||||
* Will update version in the following files :
|
|
||||||
*
|
|
||||||
* * datamodels/2.x/.../module.*.php
|
|
||||||
* * datamodels/2.x/version.xml
|
|
||||||
* * css/css-variables.scss $version
|
|
||||||
*
|
|
||||||
* Usage :
|
|
||||||
* `php .make\release\update-versions.php "2.7.0-rc"`
|
|
||||||
*
|
|
||||||
* @since 2.7.0
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
require_once (__DIR__.'/../../approot.inc.php');
|
|
||||||
require_once (__DIR__.DIRECTORY_SEPARATOR.'update.classes.inc.php');
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @var \FileVersionUpdater[] $aFilesUpdaters */
|
|
||||||
$aFilesUpdaters = array(
|
|
||||||
new iTopVersionFileUpdater(),
|
|
||||||
new DatamodelsModulesFiles(),
|
|
||||||
new ConstantFileUpdater('ITOP_CORE_VERSION', 'approot.inc.php'),
|
|
||||||
);
|
|
||||||
|
|
||||||
if (count($argv) === 1)
|
|
||||||
{
|
|
||||||
echo '/!\ You must pass the new version as parameter';
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
$sVersionLabel = $argv[1];
|
|
||||||
if (empty($sVersionLabel))
|
|
||||||
{
|
|
||||||
echo 'Version passed as parameter is empty !';
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($aFilesUpdaters as $oFileVersionUpdater)
|
|
||||||
{
|
|
||||||
$oFileVersionUpdater->UpdateAllFiles($sVersionLabel);
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Tool to automate datamodel version update in XML
|
|
||||||
*
|
|
||||||
* Will update version in the following files :
|
|
||||||
*
|
|
||||||
* datamodels/2.x/.../datamodel.*.xml
|
|
||||||
* application/*.xml
|
|
||||||
* core/*.xml
|
|
||||||
*
|
|
||||||
* Usage :
|
|
||||||
* `php .make\release\update-xml.php "1.7"`
|
|
||||||
* `php .make\release\update-xml.php`
|
|
||||||
*
|
|
||||||
* If no parameter provided then the current XML version will be used as target version
|
|
||||||
*
|
|
||||||
* @since 2.7.0 simple version change using regexp (not doing conversion)
|
|
||||||
* @since 3.1.0 N°5405 now does a real conversion
|
|
||||||
* @since 3.1.0 N°5633 allow to use without parameter
|
|
||||||
* @since 3.1.0 N°5633 add /application and /core XML files
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
require_once (__DIR__.'/../../approot.inc.php');
|
|
||||||
require_once (__DIR__.DIRECTORY_SEPARATOR.'update.classes.inc.php');
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (count($argv) === 1)
|
|
||||||
{
|
|
||||||
echo '/!\ No version passed: assuming target XML version is current XML version ('.ITOP_DESIGN_LATEST_VERSION.")\n";
|
|
||||||
$sVersionLabel = ITOP_DESIGN_LATEST_VERSION;
|
|
||||||
} else {
|
|
||||||
$sVersionLabel = $argv[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($sVersionLabel))
|
|
||||||
{
|
|
||||||
echo 'Version passed as parameter is empty !';
|
|
||||||
exit(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
$oFileVersionUpdater = new DatamodelsXmlFiles();
|
|
||||||
$oFileVersionUpdater->UpdateAllFiles($sVersionLabel);
|
|
||||||
@@ -1,232 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Classes for updater tools
|
|
||||||
*
|
|
||||||
* @see update-versions.php
|
|
||||||
* @see update-xml.php
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
require_once (__DIR__.'/../../approot.inc.php');
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
abstract class FileVersionUpdater
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @return string[] full path of files to modify
|
|
||||||
*/
|
|
||||||
abstract public function GetFiles();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Warnign : will consume lots of memory on larger files !
|
|
||||||
*
|
|
||||||
* @param string $sVersionLabel
|
|
||||||
* @param string $sFileContent
|
|
||||||
* @param string $sFileFullPath
|
|
||||||
*
|
|
||||||
* @return string file content with replaced values
|
|
||||||
*/
|
|
||||||
abstract public function UpdateFileContent($sVersionLabel, $sFileContent, $sFileFullPath);
|
|
||||||
|
|
||||||
public function UpdateAllFiles($sVersionLabel)
|
|
||||||
{
|
|
||||||
$aFilesToUpdate = $this->GetFiles();
|
|
||||||
$sFileUpdaterName = get_class($this);
|
|
||||||
echo "# Updater : $sFileUpdaterName\n";
|
|
||||||
foreach ($aFilesToUpdate as $sFileToUpdateFullPath)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
$sCurrentFileContent = file_get_contents($sFileToUpdateFullPath);
|
|
||||||
$sNewFileContent = $this->UpdateFileContent($sVersionLabel, $sCurrentFileContent, $sFileToUpdateFullPath);
|
|
||||||
file_put_contents($sFileToUpdateFullPath, $sNewFileContent);
|
|
||||||
echo " - $sFileToUpdateFullPath : OK !\n";
|
|
||||||
}
|
|
||||||
catch (Exception $e)
|
|
||||||
{
|
|
||||||
echo " - $sFileToUpdateFullPath : Error :(\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class AbstractSingleFileVersionUpdater extends FileVersionUpdater
|
|
||||||
{
|
|
||||||
private $sFileToUpdate;
|
|
||||||
|
|
||||||
public function __construct($sFileToUpdate)
|
|
||||||
{
|
|
||||||
$this->sFileToUpdate = $sFileToUpdate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetFiles()
|
|
||||||
{
|
|
||||||
return array(APPROOT.$this->sFileToUpdate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @since 2.7.7 3.0.1 3.1.0 N°4714
|
|
||||||
*/
|
|
||||||
class ConstantFileUpdater extends AbstractSingleFileVersionUpdater {
|
|
||||||
/** @var string */
|
|
||||||
private $sConstantName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param $sConstantName constant to search, for example `ITOP_CORE_VERSION`
|
|
||||||
* @param $sFileToUpdate file containing constant definition
|
|
||||||
*/
|
|
||||||
public function __construct($sConstantName, $sFileToUpdate)
|
|
||||||
{
|
|
||||||
$this->sConstantName = $sConstantName;
|
|
||||||
parent::__construct($sFileToUpdate);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function UpdateFileContent($sVersionLabel, $sFileContent, $sFileFullPath)
|
|
||||||
{
|
|
||||||
$sConstantSearchPattern = <<<REGEXP
|
|
||||||
/define\('{$this->sConstantName}', ?'[^']+'\);/
|
|
||||||
REGEXP;
|
|
||||||
|
|
||||||
return preg_replace(
|
|
||||||
$sConstantSearchPattern,
|
|
||||||
"define('{$this->sConstantName}', '{$sVersionLabel}');",
|
|
||||||
$sFileContent
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class iTopVersionFileUpdater extends AbstractSingleFileVersionUpdater
|
|
||||||
{
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct('datamodels/2.x/version.xml');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function UpdateFileContent($sVersionLabel, $sFileContent, $sFileFullPath)
|
|
||||||
{
|
|
||||||
return preg_replace(
|
|
||||||
'/(<version>)[^<]*(<\/version>)/',
|
|
||||||
'${1}'.$sVersionLabel.'${2}',
|
|
||||||
$sFileContent
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class AbstractGlobFileVersionUpdater extends FileVersionUpdater
|
|
||||||
{
|
|
||||||
/** @var array|string glob patterns to seek for files to modify */
|
|
||||||
protected $globPattern;
|
|
||||||
|
|
||||||
public function __construct($globPattern)
|
|
||||||
{
|
|
||||||
$this->globPattern = $globPattern;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function GetFiles()
|
|
||||||
{
|
|
||||||
$aGlobPatterns = (is_array($this->globPattern))
|
|
||||||
? $this->globPattern
|
|
||||||
: [$this->globPattern];
|
|
||||||
|
|
||||||
$aFiles = [];
|
|
||||||
foreach ($aGlobPatterns as $sGlobPattern) {
|
|
||||||
$result = glob($sGlobPattern);
|
|
||||||
if (false === $result) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/** @noinspection SlowArrayOperationsInLoopInspection */
|
|
||||||
$aFiles = array_merge($aFiles, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $aFiles;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class DatamodelsModulesFiles extends AbstractGlobFileVersionUpdater
|
|
||||||
{
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct(APPROOT.'datamodels/2.x/*/module.*.php');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function UpdateFileContent($sVersionLabel, $sFileContent, $sFileFullPath)
|
|
||||||
{
|
|
||||||
$sModulePath = realpath($sFileFullPath);
|
|
||||||
$sModuleFileName = basename($sModulePath, 1);
|
|
||||||
$sModuleName = preg_replace('/[^.]+\.([^.]+)\.php/', '$1', $sModuleFileName);
|
|
||||||
|
|
||||||
return preg_replace(
|
|
||||||
"/('$sModuleName\/)[^']+(')/",
|
|
||||||
'${1}'.$sVersionLabel.'${2}',
|
|
||||||
$sFileContent
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class DatamodelsXmlFiles extends AbstractGlobFileVersionUpdater
|
|
||||||
{
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct([
|
|
||||||
APPROOT.'datamodels/2.x/*/datamodel.*.xml',
|
|
||||||
APPROOT.'application/*.xml',
|
|
||||||
APPROOT.'core/*.xml',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function UpdateFileContent($sVersionLabel, $sFileContent, $sFileFullPath)
|
|
||||||
{
|
|
||||||
require_once APPROOT.'setup/itopdesignformat.class.inc.php';
|
|
||||||
$oFileXml = new DOMDocument();
|
|
||||||
/** @noinspection PhpComposerExtensionStubsInspection */
|
|
||||||
libxml_clear_errors();
|
|
||||||
$oFileXml->formatOutput = true;
|
|
||||||
$oFileXml->preserveWhiteSpace = false;
|
|
||||||
$oFileXml->loadXML($sFileContent);
|
|
||||||
|
|
||||||
$oFileItopFormat = new iTopDesignFormat($oFileXml);
|
|
||||||
|
|
||||||
$sDesignVersionToSet = static::GetDesignVersionToSet($oFileItopFormat->GetVersion());
|
|
||||||
if (false === is_null($sDesignVersionToSet)) {
|
|
||||||
// N°5779 if same as target version, we will try to convert from version below
|
|
||||||
$oFileItopFormat->GetITopDesignNode()->setAttribute('version', $sDesignVersionToSet);
|
|
||||||
}
|
|
||||||
|
|
||||||
$bConversionResult = $oFileItopFormat->Convert($sVersionLabel);
|
|
||||||
|
|
||||||
if (false === $bConversionResult) {
|
|
||||||
throw new Exception("Error when converting $sFileFullPath");
|
|
||||||
}
|
|
||||||
|
|
||||||
return $oFileItopFormat->GetXmlAsString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return ?string version to use : if file version is same as current version then return previous version, else return null
|
|
||||||
* @since 3.1.0 N°5779
|
|
||||||
*/
|
|
||||||
protected static function GetDesignVersionToSet($sFileDesignVersion):?string {
|
|
||||||
if ($sFileDesignVersion !== ITOP_DESIGN_LATEST_VERSION) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return iTopDesignFormat::GetPreviousDesignVersion(ITOP_DESIGN_LATEST_VERSION);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
164
CONTRIBUTING.md
164
CONTRIBUTING.md
@@ -1,164 +0,0 @@
|
|||||||
# Contributing to iTop
|
|
||||||
|
|
||||||
You want to contribute to iTop? Many thanks to you! 🎉 👍
|
|
||||||
|
|
||||||
Here are some guidelines that will help us integrate your work!
|
|
||||||
|
|
||||||
|
|
||||||
## Contributions
|
|
||||||
|
|
||||||
### Subjects
|
|
||||||
You are welcome to create pull requests on any of those subjects:
|
|
||||||
|
|
||||||
* 🐛 bug fix
|
|
||||||
* 🌐 translation / i18n / l10n
|
|
||||||
|
|
||||||
If you want to implement a **new feature**, please [create a corresponding ticket](https://sourceforge.net/p/itop/tickets/new/) for review.
|
|
||||||
If you ever want to begin implementation, do so in a fork, and add a link to the corresponding commits in the ticket.
|
|
||||||
|
|
||||||
For all **security related subjects**, please see our [security policy](SECURITY.md).
|
|
||||||
|
|
||||||
All **datamodel modification** should be done in an extension. Beware that such change would
|
|
||||||
impact all existing customers, and could prevent them from
|
|
||||||
upgrading!
|
|
||||||
Combodo has a long experience of datamodel changes: they are very disruptive!
|
|
||||||
This is why we avoid them in iTop core, especially the changes on existing objects/fields.
|
|
||||||
If you have an idea you're sure would benefit to all of iTop users, you may
|
|
||||||
[create a corresponding ticket](https://sourceforge.net/p/itop/tickets/new/) to submit it, but be warned that there are lots of good
|
|
||||||
reasons to refuse such changes.
|
|
||||||
|
|
||||||
### 📄 License and copyright
|
|
||||||
iTop is distributed under the AGPL-3.0 license (see the [license.txt] file).
|
|
||||||
|
|
||||||
The iTop repository is divided in three parts: iTop (mainly PHP/JS/XML sources and dictionaries), images, and third-party libraries.
|
|
||||||
Combodo has the copyright on most of the source files in the iTop part of the repository: please do not modify the existing file copyrights.
|
|
||||||
Anyhow, you are encouraged to signal your contribution by the mean of `@author` annotations.
|
|
||||||
|
|
||||||
If you want to use another license or keep the code ownership (copyright), you may [create an extension][wiki new ext].
|
|
||||||
|
|
||||||
[license.txt]: https://github.com/Combodo/iTop/blob/develop/license.txt
|
|
||||||
[wiki new ext]: https://www.itophub.io/wiki/page?id=latest%3Acustomization%3Astart#by_writing_your_own_extension
|
|
||||||
|
|
||||||
|
|
||||||
## 🔀 iTop branch model
|
|
||||||
|
|
||||||
When we first start with Git, we were using the [GitFlow](https://nvie.com/posts/a-successful-git-branching-model/) branch model. As
|
|
||||||
there was some confusions about branches to use for current developed release and previous maintained release, and also because we were
|
|
||||||
using just a very few of the GitFlow commands, we decided to add just a little modification to this branch model : since april 2020
|
|
||||||
we don't have a `master` branch anymore.
|
|
||||||
|
|
||||||
Here are the branches we use and their meaning :
|
|
||||||
|
|
||||||
- `develop`: ongoing development version
|
|
||||||
- `release/*`: if present, that means we are working on a alpha/beta/rc version for shipping
|
|
||||||
- `support/*`: maintenance branches for older versions
|
|
||||||
|
|
||||||
For example, if no version is currently prepared for shipping we could have:
|
|
||||||
|
|
||||||
- `develop` containing future 3.1.0 version
|
|
||||||
- `support/3.0`: 3.0.x maintenance version
|
|
||||||
- `support/2.7`: 2.7.x maintenance version
|
|
||||||
- `support/2.6`: 2.6.x maintenance version
|
|
||||||
|
|
||||||
In this example, when 3.1.0-beta is shipped that will become:
|
|
||||||
|
|
||||||
- `develop`: future 3.2.0 version
|
|
||||||
- `release/3.1.0`: 3.1.0-beta
|
|
||||||
- `support/3.0`: 3.0.x maintenance version
|
|
||||||
- `support/2.7`: 2.7.x maintenance version
|
|
||||||
- `support/2.6`: 2.6.x maintenance version
|
|
||||||
|
|
||||||
And when 3.1.0 final will be out:
|
|
||||||
|
|
||||||
- `develop`: future 3.2.0 version
|
|
||||||
- `support/3.1`: 3.1.x maintenance version (will host developments for 3.1.1)
|
|
||||||
- `support/3.0`: 3.0.x maintenance version
|
|
||||||
- `support/2.7`: 2.7.x maintenance version
|
|
||||||
- `support/2.6`: 2.6.x maintenance version
|
|
||||||
|
|
||||||
Also note that we have a "micro-version" concept : each of those versions have a very small amount of modifications. They are made from
|
|
||||||
`support/*` branches as well. For example 2.6.2-1 and 2.6.2-2 were made from the `support/2.6.2` branch.
|
|
||||||
|
|
||||||
|
|
||||||
## Coding
|
|
||||||
|
|
||||||
### 🌐 Translations
|
|
||||||
|
|
||||||
A [dedicated page](https://www.itophub.io/wiki/page?id=latest%3Acustomization%3Atranslation) is available in the official wiki.
|
|
||||||
|
|
||||||
### Where to start ?
|
|
||||||
|
|
||||||
1. Create a fork from our repository (see [Working with forks - GitHub Help](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/working-with-forks))
|
|
||||||
2. Create a branch in this fork, based on the develop branch
|
|
||||||
3. Code !
|
|
||||||
|
|
||||||
Do create a dedicated branch for each modification you want to propose : if you don't it will be very hard to merge back your work !
|
|
||||||
|
|
||||||
Most of the time you should based your developments on the develop branch.
|
|
||||||
That may be different if you want to fix a bug, please use develop anyway and ask in your PR if rebase is possible.
|
|
||||||
|
|
||||||
|
|
||||||
### 🎨 PHP styleguide
|
|
||||||
|
|
||||||
Please follow [our guidelines](https://www.itophub.io/wiki/page?id=latest%3Acustomization%3Acoding_standards).
|
|
||||||
|
|
||||||
### ✅ Tests
|
|
||||||
|
|
||||||
Please create tests that covers as much as possible the code you're submitting.
|
|
||||||
|
|
||||||
Our tests are located in the `test/` directory, containing a PHPUnit config file : `phpunit.xml.dist`.
|
|
||||||
|
|
||||||
### Git Commit Messages
|
|
||||||
|
|
||||||
* Describe the functional change instead of the technical modifications
|
|
||||||
* Use the present tense ("Add feature" not "Added feature")
|
|
||||||
* Use the imperative mood ("Move cursor to..." not "Moves cursor to...")
|
|
||||||
* Limit the first line to 72 characters or less
|
|
||||||
* Please start the commit message with an applicable emoji code (following the [Gitmoji guide](https://gitmoji.dev/)).
|
|
||||||
Beware to use the code (for example `:bug:`) and not the character (🐛) as Unicode support in git clients is very poor for now...
|
|
||||||
Emoji examples :
|
|
||||||
* 🌐 `:globe_with_meridians:` for translations
|
|
||||||
* 🎨 `:art:` when improving the format/structure of the code
|
|
||||||
* ⚡️ `:zap:` when improving performance
|
|
||||||
* 🐛 `:bug:` when fixing a bug
|
|
||||||
* 🔥 `:fire:` when removing code or files
|
|
||||||
* 💚 `:green_heart:` when fixing the CI build
|
|
||||||
* ✅ `:white_check_mark:` when adding tests
|
|
||||||
* 🔒 `:lock:` when dealing with security
|
|
||||||
* ⬆️ `:arrow_up:` when upgrading dependencies
|
|
||||||
* ⬇️ `:arrow_down:` when downgrading dependencies
|
|
||||||
* ♻️ `:recycle:` code refactoring
|
|
||||||
* 💄 `:lipstick:` Updating the UI and style files.
|
|
||||||
|
|
||||||
## 👥 Pull request
|
|
||||||
|
|
||||||
When your code is working, please:
|
|
||||||
|
|
||||||
* Squash as much as possible your commits,
|
|
||||||
* Rebase your branch on our repo last commit,
|
|
||||||
* Create a pull request. _Detailed procedure to work on fork and create PR is available [in GitHub help pages](https://help.github.com/articles/creating-a-pull-request-from-a-fork/)_.
|
|
||||||
* Pull request description: mind to add all the information useful to understand why you're suggesting this modification and anything necessary to dive into your work. Especially:
|
|
||||||
- Bugfixes: exact steps to reproduce the bug (given/when/then), description of the bug cause and what solution is implemented
|
|
||||||
- Enhancements: use cases, implementation details if needed
|
|
||||||
* Mind to check the "[Allow edits from maintainers](https://docs.github.com/en/github-ae@latest/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork)" option ! (note that if you are working with an org fork, this option [won't be available](https://github.com/orgs/community/discussions/5634))
|
|
||||||
|
|
||||||
|
|
||||||
## 🙏 We are thankful
|
|
||||||
|
|
||||||
We are thankful for all your contributions to the iTop universe! As a thank you gift, we will send stickers to every iTop (& extensions) contributors!
|
|
||||||
|
|
||||||
We have one sticker per contribution type. You might get multiple stickers with one contribution though :)
|
|
||||||
|
|
||||||
* Bug hunter: Fix a bug
|
|
||||||
* Translator: Add/update translations
|
|
||||||
* White hat: Find and/or fix a vulnerability
|
|
||||||
* Contributor: Contribute by finding a bug, making an extension or any other way
|
|
||||||
* Partner: For Combodo's official partners
|
|
||||||
* Graduated: Follow a Combodo's iTop training
|
|
||||||
* Ambassador: Outstanding community contributors
|
|
||||||
* Beta tester: Test and give feedback on beta releases
|
|
||||||
* Extension developer: Develop and publish an extension
|
|
||||||
|
|
||||||
Here is the design of each stickers for year 2024:
|
|
||||||
|
|
||||||

|
|
||||||
19
Jenkinsfile
vendored
19
Jenkinsfile
vendored
@@ -1,19 +0,0 @@
|
|||||||
def infra
|
|
||||||
|
|
||||||
node(){
|
|
||||||
properties([
|
|
||||||
buildDiscarder(
|
|
||||||
logRotator(
|
|
||||||
daysToKeepStr: "28",
|
|
||||||
numToKeepStr: "500")
|
|
||||||
)
|
|
||||||
])
|
|
||||||
|
|
||||||
checkout scm
|
|
||||||
|
|
||||||
infra = load '/var/lib/jenkins/workspace/itop-test-infra_master/src/Infra.groovy'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
infra.call()
|
|
||||||
|
|
||||||
157
README.md
157
README.md
@@ -1,157 +0,0 @@
|
|||||||
<p align="center"><a href="https://combodo.com" target="_blank">
|
|
||||||
<picture>
|
|
||||||
<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">
|
|
||||||
<img src="/images/logos/logo-itop-baseline-light.svg" width="350" alt="Logo iTop with baseline" />
|
|
||||||
</picture>
|
|
||||||
</a></p>
|
|
||||||
|
|
||||||
|
|
||||||
iTop stands for IT Operations Portal. It is a complete open source and web-based IT service management platform, including a fully customizable CMDB, a helpdesk system, and a document management tool. It is ITIL compliant and easily customizable and extensible thanks to a high number of add-ons and web services to integrate with your IT.
|
|
||||||
|
|
||||||
iTop also offers mass import tools to help you become even more efficient.
|
|
||||||
|
|
||||||
## Features
|
|
||||||
- Fully configurable [Configuration Management (CMDB)][10]
|
|
||||||
- [HelpDesk][11] and Incident Management
|
|
||||||
- [Service and Contract Management][12]
|
|
||||||
- [Change][13] Management
|
|
||||||
- Configurable [SLA][14] Management
|
|
||||||
- Graphical [impact analysis][15]
|
|
||||||
- [CSV import][16] tool for any data
|
|
||||||
- Consistency [audit][17] to check data quality
|
|
||||||
- [Data synchronization][18] (for data federation)
|
|
||||||
|
|
||||||
|
|
||||||
## Latest release
|
|
||||||
|
|
||||||
- [Changes since the previous version][62]
|
|
||||||
- [New features][63]
|
|
||||||
- [Installation notes][64]
|
|
||||||
- [Download][65]
|
|
||||||
|
|
||||||
[62]: https://www.itophub.io/wiki/page?id=latest:release:change_log
|
|
||||||
[63]: https://www.itophub.io/wiki/page?id=latest:release:start
|
|
||||||
[64]: https://www.itophub.io/wiki/page?id=latest:install:start
|
|
||||||
[65]: https://sourceforge.net/projects/itop/files/latest/download
|
|
||||||
|
|
||||||
|
|
||||||
## Resources
|
|
||||||
|
|
||||||
- [iTop Forums][1]: community support
|
|
||||||
- [iTop Tickets][2]: for feature requests and bug reports
|
|
||||||
- [Releases download][3]
|
|
||||||
- [iTop requirements][4]
|
|
||||||
- [Documentation][5] covering both iTop and its official extensions
|
|
||||||
- [iTop Hub][6] : discover and install extensions !
|
|
||||||
- [iTop versions history][7]
|
|
||||||
|
|
||||||
|
|
||||||
[1]: https://sourceforge.net/p/itop/discussion/
|
|
||||||
[2]: https://sourceforge.net/p/itop/tickets/
|
|
||||||
[3]: https://sourceforge.net/projects/itop/files/itop/
|
|
||||||
[4]: https://www.itophub.io/wiki/page?id=latest:install:requirements
|
|
||||||
[5]: https://www.itophub.io/wiki
|
|
||||||
[6]: https://store.itophub.io/en_US/
|
|
||||||
[7]: .doc/itop-version-history.md
|
|
||||||
|
|
||||||
[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
|
|
||||||
[12]: https://www.itophub.io/wiki/page?id=latest%3Adatamodel%3Astart#service_management
|
|
||||||
[13]: https://www.itophub.io/wiki/page?id=latest%3Adatamodel%3Astart#change_management
|
|
||||||
[14]: https://www.itophub.io/wiki/page?id=latest%3Aimplementation%3Astart#service_level_agreements_and_targets
|
|
||||||
[15]: https://www.itophub.io/wiki/page?id=latest%3Auser%3Aactions#relations
|
|
||||||
[16]: https://www.itophub.io/wiki/page?id=latest%3Auser%3Abulk_modify#uploading_data
|
|
||||||
[17]: https://www.itophub.io/wiki/page?id=latest%3Aadmin%3Aaudit
|
|
||||||
[18]: https://www.itophub.io/wiki/page?id=latest%3Aadvancedtopics%3Adata_synchro_overview
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## About Us
|
|
||||||
|
|
||||||
iTop development is sponsored, led, and supported by [Combodo][0].
|
|
||||||
|
|
||||||
[0]: https://www.combodo.com
|
|
||||||
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
We would like to give a special thank you 🤗 to the people from the community who contributed to this project, including:
|
|
||||||
|
|
||||||
### Names
|
|
||||||
|
|
||||||
- Al Hallak, Amr (a.k.a [@v4yne1](https://github.com/v4yne1))
|
|
||||||
- Alves, David
|
|
||||||
- Audon, Florian
|
|
||||||
- Beck, Pedro
|
|
||||||
- Beer, Christian (a.k.a [@ChristianBeer](https://www.github.com/ChristianBeer))
|
|
||||||
- Bilger, Jean-François
|
|
||||||
- Bostoen, Jeffrey (a.k.a [@jbostoen](https://www.github.com/jbostoen))
|
|
||||||
- Cardoso, Anderson
|
|
||||||
- Cassaro, Bruno
|
|
||||||
- Casteleyn, Thomas (a.k.a [@Hipska](https://www.github.com/Hipska))
|
|
||||||
- Castro, Randall Badilla
|
|
||||||
- Colantoni, Maria Laura
|
|
||||||
- Couronné, Guy
|
|
||||||
- Dejin, Bie (a.k.a [@bdejin](https://github.com/bdejin))
|
|
||||||
- Delicado, Elodie
|
|
||||||
- Dvořák, Lukáš
|
|
||||||
- Goethals, Stefan
|
|
||||||
- Giuva, Vincenzo Katriel (a.k.a [@DarkNight97boss](https://github.com/DarkNight97boss))
|
|
||||||
- Gumble, David
|
|
||||||
- Heloir, Arthur
|
|
||||||
- Janssens, Jelle (a.k.a [@janssensjelle](https://github.com/janssensjelle))
|
|
||||||
- Ji, Leeb (冀利斌) (a.k.a [@chileeb](https://github.com/chileeb))
|
|
||||||
- Kaltefleiter, Lars (a.k.a [@larhip](https://www.github.com/larhip))
|
|
||||||
- Khamit, Shamil
|
|
||||||
- Kincel, Martin
|
|
||||||
- Konečný, Kamil
|
|
||||||
- Kunin, Vladimir
|
|
||||||
- Lassiter, Denis (a.k.a [@delassiter](https://github.com/delassiter))
|
|
||||||
- Lazcano, Federico
|
|
||||||
- Lucas, Jonathan
|
|
||||||
- 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))
|
|
||||||
- Mozart de Oliveira, Eduardo (a.k.a [@eduardomozart](https://github.com/eduardomozart))
|
|
||||||
- Raenker, Martin
|
|
||||||
- Roháč, Richard (a.k.a [@RohacRichard](https://github.com/RohacRichard))
|
|
||||||
- Rosenke, Stephan
|
|
||||||
- Rossi, Tommaso (a.k.a [@tomrss](https://www.github.com/tomrss))
|
|
||||||
- Rudner, Björn (a.k.a [@rudnerbjoern](https://github.com/rudnerbjoern))
|
|
||||||
- Šafránek, Jaroslav (a.k.a [jkcinik](https://sourceforge.net/u/jkcinik/profile/) on SourceForge)
|
|
||||||
- Seki, Shoji
|
|
||||||
- Shilov, Vladimir
|
|
||||||
- Stetina, Pavel (a.k.a [@Stetinac](https://github.com/Stetinac))
|
|
||||||
- Stukalov, Ilya (a.k.a [@ilya](https://www.github.com/ilya-stukalov))
|
|
||||||
- Tarjányi, Csaba (a.k.a [@tacsaby](https://github.com/tacsaby))
|
|
||||||
- Toraya, Chairat (a.k.a [@Kyokito1412](https://github.com/Kyokito1412))
|
|
||||||
- Tulio, Marco
|
|
||||||
- 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))
|
|
||||||
|
|
||||||
### Aliases
|
|
||||||
|
|
||||||
- chifu1234
|
|
||||||
- cprobst
|
|
||||||
- DudekArtur
|
|
||||||
- Karkoff1212
|
|
||||||
- Laura
|
|
||||||
- nv35
|
|
||||||
- Purple Grape
|
|
||||||
- Schlobinux
|
|
||||||
- theBigOne
|
|
||||||
- ulmerspatz
|
|
||||||
|
|
||||||
### Companies
|
|
||||||
|
|
||||||
- [Hardis](https://www.hardis-group.com/)
|
|
||||||
- [ITOMIG](https://www.itomig.de/)
|
|
||||||
- [Pimkie](https://www.pimkie.com/)
|
|
||||||
- [Super-Visions](https://www.super-visions.com/)
|
|
||||||
- [Defence Tech Cyber Security - Malware Lab](https://github.com/DefenceTechSecurity)
|
|
||||||
- Orange Cyberdefense
|
|
||||||
- MipihSIB
|
|
||||||
44
SECURITY.md
44
SECURITY.md
@@ -1,44 +0,0 @@
|
|||||||
# 🔒 Reporting vulnerabilities
|
|
||||||
|
|
||||||
We take all security bugs seriously. Thank you for improving the security of iTop! We appreciate your efforts and
|
|
||||||
responsible disclosure and will make every effort to acknowledge your contributions.
|
|
||||||
|
|
||||||
|
|
||||||
## ✉️ How to report
|
|
||||||
|
|
||||||
### iTop vulnerabilities
|
|
||||||
Please send a procedure to reproduce iTop vulnerabilities to [itop-security@combodo.com](mailto:itop-security@combodo.com).
|
|
||||||
|
|
||||||
You can send us a standard "given / when / then" report, including iTop version, impacts, and maybe installed modules or data if they are
|
|
||||||
needed to reproduce.
|
|
||||||
|
|
||||||
### Dependencies vulnerabilities
|
|
||||||
Report security bugs in third-party modules to the person or team maintaining the module, and notify us of this report by sending an email
|
|
||||||
to [itop-security@combodo.com](mailto:itop-security@combodo.com).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 🔍 Combodo acknowledgment and investigation
|
|
||||||
Report sent to us will be acknowledged within the week.
|
|
||||||
|
|
||||||
Then, a Combodo developer will be assigned to the reported issue and will:
|
|
||||||
|
|
||||||
* confirm the problem and determine the affected iTop versions
|
|
||||||
* audit the code to search any potential similar problems
|
|
||||||
* try to find a workaround if any
|
|
||||||
* create fixes for all releases still under maintenance
|
|
||||||
* send you the commit(s) for review
|
|
||||||
* send you the next version(s) that will contain the fix, and the estimated release dates
|
|
||||||
|
|
||||||
Security issues always take precedence over bug fixes and feature work.
|
|
||||||
|
|
||||||
The assignee will keep you informed of the resolution progress, and may ask you for additional information or guidance.
|
|
||||||
|
|
||||||
|
|
||||||
## 📆 Disclosure Policy
|
|
||||||
Once the fix is done and acknowledged by every stakeholder, it will be included in the next iTop version.
|
|
||||||
Mind we have at least 2 active branches (LTS and STS, see [iTop Community Releases [iTop Documentation]](https://www.itophub.io/wiki/page?id=latest:release:start))
|
|
||||||
|
|
||||||
The release communications will include the information of the vulnerability fix.
|
|
||||||
|
|
||||||
Corresponding GitHub advisories and CVE will be published 3 months after the iTop version release date so that iTop instances can be updated.
|
|
||||||
368
addons/userrights/userrightsmatrix.class.inc.php
Normal file
368
addons/userrights/userrightsmatrix.class.inc.php
Normal file
@@ -0,0 +1,368 @@
|
|||||||
|
<?php
|
||||||
|
// Copyright (C) 2010-2012 Combodo SARL
|
||||||
|
//
|
||||||
|
// 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-2012 Combodo SARL
|
||||||
|
* @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
|
||||||
|
|
||||||
|
// Create a change to record the history of the User object
|
||||||
|
$oChange = MetaModel::NewObject("CMDBChange");
|
||||||
|
$oChange->Set("date", time());
|
||||||
|
$oChange->Set("userinfo", "Initialization");
|
||||||
|
$iChangeId = $oChange->DBInsert();
|
||||||
|
|
||||||
|
// Now record the admin user object
|
||||||
|
$iUserId = $oUser->DBInsertTrackedNoReload($oChange, true /* skip security */);
|
||||||
|
$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');
|
||||||
|
|
||||||
|
?>
|
||||||
78
addons/userrights/userrightsnull.class.inc.php
Normal file
78
addons/userrights/userrightsnull.class.inc.php
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
// Copyright (C) 2010-2012 Combodo SARL
|
||||||
|
//
|
||||||
|
// 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-2012 Combodo SARL
|
||||||
|
* @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
1088
addons/userrights/userrightsprofile.db.class.inc.php
Normal file
1088
addons/userrights/userrightsprofile.db.class.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
1253
addons/userrights/userrightsprojection.class.inc.php
Normal file
1253
addons/userrights/userrightsprojection.class.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
29
app.php
29
app.php
@@ -1,29 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Combodo\iTop\Kernel;
|
|
||||||
|
|
||||||
require_once __DIR__.'/lib/autoload_runtime.php';
|
|
||||||
|
|
||||||
require_once('approot.inc.php');
|
|
||||||
require_once('application/startup.inc.php');
|
|
||||||
|
|
||||||
return function (array $context) {
|
|
||||||
return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
|
|
||||||
};
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
|
||||||
* @license http://opensource.org/licenses/AGPL-3.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class DBSearchHelper
|
|
||||||
*
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
class DBSearchHelper
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Add context filter to DBUnionSearch
|
|
||||||
*
|
|
||||||
* @param \DBSearch|null $oSearch
|
|
||||||
*
|
|
||||||
* @throws \Exception
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
public static function AddContextFilter(?DBSearch $oSearch): void
|
|
||||||
{
|
|
||||||
$oAppContext = new ApplicationContext();
|
|
||||||
$sClass = $oSearch->GetClass();
|
|
||||||
foreach ($oAppContext->GetNames() as $key) {
|
|
||||||
// Find the value of the object corresponding to each 'context' parameter
|
|
||||||
$aCallSpec = [$sClass, 'MapContextParam'];
|
|
||||||
$sAttCode = '';
|
|
||||||
if (is_callable($aCallSpec)) {
|
|
||||||
$sAttCode = call_user_func($aCallSpec, $key); // Returns null when there is no mapping for this parameter
|
|
||||||
}
|
|
||||||
|
|
||||||
if (MetaModel::IsValidAttCode($sClass, $sAttCode)) {
|
|
||||||
// Add Hierarchical condition if hierarchical key
|
|
||||||
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
|
|
||||||
if (isset($oAttDef) && ($oAttDef->IsExternalKey())) {
|
|
||||||
$iDefaultValue = intval($oAppContext->GetCurrentValue($key));
|
|
||||||
if ($iDefaultValue != 0) {
|
|
||||||
try {
|
|
||||||
/** @var AttributeExternalKey $oAttDef */
|
|
||||||
$sTargetClass = $oAttDef->GetTargetClass();
|
|
||||||
$sHierarchicalKeyCode = MetaModel::IsHierarchicalClass($sTargetClass);
|
|
||||||
if ($sHierarchicalKeyCode !== false) {
|
|
||||||
$oFilter = new DBObjectSearch($sTargetClass);
|
|
||||||
$oFilter->AddCondition('id', $iDefaultValue);
|
|
||||||
$oHKFilter = new DBObjectSearch($sTargetClass);
|
|
||||||
$oHKFilter->AddCondition_PointingTo($oFilter, $sHierarchicalKeyCode, TREE_OPERATOR_BELOW);
|
|
||||||
$oSearch->AddCondition_PointingTo($oHKFilter, $sAttCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception $e) {
|
|
||||||
// If filtering fails just ignore it
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
397
application/ajaxwebpage.class.inc.php
Normal file
397
application/ajaxwebpage.class.inc.php
Normal file
@@ -0,0 +1,397 @@
|
|||||||
|
<?php
|
||||||
|
// Copyright (C) 2010-2015 Combodo SARL
|
||||||
|
//
|
||||||
|
// 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/>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple web page with no includes, header or fancy formatting, useful to
|
||||||
|
* generate HTML fragments when called by an AJAX method
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2010-2015 Combodo SARL
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once(APPROOT."/application/webpage.class.inc.php");
|
||||||
|
|
||||||
|
class ajax_page extends WebPage implements iTabbedPage
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Jquery style ready script
|
||||||
|
* @var Hash
|
||||||
|
*/
|
||||||
|
protected $m_sReadyScript;
|
||||||
|
protected $m_oTabs;
|
||||||
|
private $m_sMenu; // If set, then the menu will be updated
|
||||||
|
|
||||||
|
/**
|
||||||
|
* constructor for the web page
|
||||||
|
* @param string $s_title Not used
|
||||||
|
*/
|
||||||
|
function __construct($s_title)
|
||||||
|
{
|
||||||
|
$sPrintable = utils::ReadParam('printable', '0');
|
||||||
|
$bPrintable = ($sPrintable == '1');
|
||||||
|
|
||||||
|
parent::__construct($s_title, $bPrintable);
|
||||||
|
$this->m_sReadyScript = "";
|
||||||
|
//$this->add_header("Content-type: text/html; charset=utf-8");
|
||||||
|
$this->add_header("Cache-control: no-cache");
|
||||||
|
$this->m_oTabs = new TabManager();
|
||||||
|
$this->sContentType = 'text/html';
|
||||||
|
$this->sContentDisposition = 'inline';
|
||||||
|
$this->m_sMenu = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public function AddTabContainer($sTabContainer, $sPrefix = '')
|
||||||
|
{
|
||||||
|
$this->add($this->m_oTabs->AddTabContainer($sTabContainer, $sPrefix));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function AddToTab($sTabContainer, $sTabLabel, $sHtml)
|
||||||
|
{
|
||||||
|
$this->add($this->m_oTabs->AddToTab($sTabContainer, $sTabLabel, $sHtml));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function SetCurrentTabContainer($sTabContainer = '')
|
||||||
|
{
|
||||||
|
return $this->m_oTabs->SetCurrentTabContainer($sTabContainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function SetCurrentTab($sTabLabel = '')
|
||||||
|
{
|
||||||
|
return $this->m_oTabs->SetCurrentTab($sTabLabel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a tab which content will be loaded asynchronously via the supplied URL
|
||||||
|
*
|
||||||
|
* Limitations:
|
||||||
|
* Cross site scripting is not not allowed for security reasons. Use a normal tab with an IFRAME if you want to pull content from another server.
|
||||||
|
* Static content cannot be added inside such tabs.
|
||||||
|
*
|
||||||
|
* @param string $sTabLabel The (localised) label of the tab
|
||||||
|
* @param string $sUrl The URL to load (on the same server)
|
||||||
|
* @param boolean $bCache Whether or not to cache the content of the tab once it has been loaded. flase will cause the tab to be reloaded upon each activation.
|
||||||
|
* @since 2.0.3
|
||||||
|
*/
|
||||||
|
public function AddAjaxTab($sTabLabel, $sUrl, $bCache = true)
|
||||||
|
{
|
||||||
|
$this->add($this->m_oTabs->AddAjaxTab($sTabLabel, $sUrl, $bCache));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function GetCurrentTab()
|
||||||
|
{
|
||||||
|
return $this->m_oTabs->GetCurrentTab();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function RemoveTab($sTabLabel, $sTabContainer = null)
|
||||||
|
{
|
||||||
|
$this->m_oTabs->RemoveTab($sTabLabel, $sTabContainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the tab whose title matches a given pattern
|
||||||
|
* @return mixed The name of the tab as a string or false if not found
|
||||||
|
*/
|
||||||
|
public function FindTab($sPattern, $sTabContainer = null)
|
||||||
|
{
|
||||||
|
return $this->m_oTabs->FindTab($sPattern, $sTabContainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make the given tab the active one, as if it were clicked
|
||||||
|
* DOES NOT WORK: apparently in the *old* version of jquery
|
||||||
|
* that we are using this is not supported... TO DO upgrade
|
||||||
|
* the whole jquery bundle...
|
||||||
|
*/
|
||||||
|
public function SelectTab($sTabContainer, $sTabLabel)
|
||||||
|
{
|
||||||
|
$this->add_ready_script($this->m_oTabs->SelectTab($sTabContainer, $sTabLabel));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function AddToMenu($sHtml)
|
||||||
|
{
|
||||||
|
$this->m_sMenu .= $sHtml;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Echoes the content of the whole page
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function output()
|
||||||
|
{
|
||||||
|
if (!empty($this->sContentType))
|
||||||
|
{
|
||||||
|
$this->add_header('Content-type: '.$this->sContentType);
|
||||||
|
}
|
||||||
|
if (!empty($this->sContentDisposition))
|
||||||
|
{
|
||||||
|
$this->add_header('Content-Disposition: '.$this->sContentDisposition.'; filename="'.$this->sContentFileName.'"');
|
||||||
|
}
|
||||||
|
foreach($this->a_headers as $s_header)
|
||||||
|
{
|
||||||
|
header($s_header);
|
||||||
|
}
|
||||||
|
if ($this->m_oTabs->TabsContainerCount() > 0)
|
||||||
|
{
|
||||||
|
$this->add_ready_script(
|
||||||
|
<<<EOF
|
||||||
|
// The "tab widgets" to handle.
|
||||||
|
var tabs = $('div[id^=tabbedContent]');
|
||||||
|
|
||||||
|
// Ugly patch for a change in the behavior of jQuery UI:
|
||||||
|
// Before jQuery UI 1.9, tabs were always considered as "local" (opposed to Ajax)
|
||||||
|
// when their href was beginning by #. Starting with 1.9, a <base> tag in the page
|
||||||
|
// is taken into account and causes "local" tabs to be considered as Ajax
|
||||||
|
// unless their URL is equal to the URL of the page...
|
||||||
|
if ($('base').length > 0)
|
||||||
|
{
|
||||||
|
$('div[id^=tabbedContent] > ul > li > a').each(function() {
|
||||||
|
var sHash = location.hash;
|
||||||
|
var sCleanLocation = location.href.toString().replace(sHash, '').replace(/#$/, '');
|
||||||
|
$(this).attr("href", sCleanLocation+$(this).attr("href"));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if ($.bbq)
|
||||||
|
{
|
||||||
|
// This selector will be reused when selecting actual tab widget A elements.
|
||||||
|
var tab_a_selector = 'ul.ui-tabs-nav a';
|
||||||
|
|
||||||
|
// Enable tabs on all tab widgets. The `event` property must be overridden so
|
||||||
|
// that the tabs aren't changed on click, and any custom event name can be
|
||||||
|
// specified. Note that if you define a callback for the 'select' event, it
|
||||||
|
// will be executed for the selected tab whenever the hash changes.
|
||||||
|
tabs.tabs({ event: 'change' });
|
||||||
|
|
||||||
|
// Define our own click handler for the tabs, overriding the default.
|
||||||
|
tabs.find( tab_a_selector ).click(function()
|
||||||
|
{
|
||||||
|
var state = {};
|
||||||
|
|
||||||
|
// Get the id of this tab widget.
|
||||||
|
var id = $(this).closest( 'div[id^=tabbedContent]' ).attr( 'id' );
|
||||||
|
|
||||||
|
// Get the index of this tab.
|
||||||
|
var idx = $(this).parent().prevAll().length;
|
||||||
|
|
||||||
|
// Set the state!
|
||||||
|
state[ id ] = idx;
|
||||||
|
$.bbq.pushState( state );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tabs.tabs();
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// Render the tabs in the page (if any)
|
||||||
|
$this->s_content = $this->m_oTabs->RenderIntoContent($this->s_content, $this);
|
||||||
|
|
||||||
|
// Additional UI widgets to be activated inside the ajax fragment ??
|
||||||
|
if (($this->sContentType == 'text/html') && (preg_match('/class="date-pick"/', $this->s_content) || preg_match('/class="datetime-pick"/', $this->s_content)) )
|
||||||
|
{
|
||||||
|
$this->add_ready_script(
|
||||||
|
<<<EOF
|
||||||
|
$(".date-pick").datepicker({
|
||||||
|
showOn: 'button',
|
||||||
|
buttonImage: '../images/calendar.png',
|
||||||
|
buttonImageOnly: true,
|
||||||
|
dateFormat: 'yy-mm-dd',
|
||||||
|
constrainInput: false,
|
||||||
|
changeMonth: true,
|
||||||
|
changeYear: true
|
||||||
|
});
|
||||||
|
$(".datetime-pick").datepicker({
|
||||||
|
showOn: 'button',
|
||||||
|
buttonImage: '../images/calendar.png',
|
||||||
|
buttonImageOnly: true,
|
||||||
|
dateFormat: 'yy-mm-dd 00:00:00',
|
||||||
|
constrainInput: false,
|
||||||
|
changeMonth: true,
|
||||||
|
changeYear: true
|
||||||
|
});
|
||||||
|
EOF
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$s_captured_output = $this->ob_get_clean_safe();
|
||||||
|
if (($this->sContentType == 'text/html') && ($this->sContentDisposition == 'inline'))
|
||||||
|
{
|
||||||
|
// inline content != attachment && html => filter all scripts for malicious XSS scripts
|
||||||
|
echo self::FilterXSS($this->s_content);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
echo $this->s_content;
|
||||||
|
}
|
||||||
|
if (!empty($this->m_sMenu))
|
||||||
|
{
|
||||||
|
$uid = time();
|
||||||
|
echo "<div id=\"accordion_temp_$uid\">\n";
|
||||||
|
echo "<div id=\"accordion\">\n";
|
||||||
|
echo "<!-- Beginning of the accordion menu -->\n";
|
||||||
|
echo self::FilterXSS($this->m_sMenu);
|
||||||
|
echo "<!-- End of the accordion menu-->\n";
|
||||||
|
echo "</div>\n";
|
||||||
|
echo "</div>\n";
|
||||||
|
|
||||||
|
echo "<script type=\"text/javascript\">\n";
|
||||||
|
echo "$('#inner_menu').html($('#accordion_temp_$uid').html());\n";
|
||||||
|
echo "$('#accordion_temp_$uid').remove();\n";
|
||||||
|
echo "$('#accordion').accordion({ header: 'h3', navigation: true, autoHeight: false, collapsible: false, icons: false });\n";
|
||||||
|
echo "\n</script>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
//echo $this->s_deferred_content;
|
||||||
|
if (count($this->a_scripts) > 0)
|
||||||
|
{
|
||||||
|
echo "<script type=\"text/javascript\">\n";
|
||||||
|
echo implode("\n", $this->a_scripts);
|
||||||
|
echo "\n</script>\n";
|
||||||
|
}
|
||||||
|
if (!empty($this->s_deferred_content))
|
||||||
|
{
|
||||||
|
echo "<script type=\"text/javascript\">\n";
|
||||||
|
echo "\$('body').append('".addslashes(str_replace("\n", '', $this->s_deferred_content))."');\n";
|
||||||
|
echo "\n</script>\n";
|
||||||
|
}
|
||||||
|
if (!empty($this->m_sReadyScript))
|
||||||
|
{
|
||||||
|
echo "<script type=\"text/javascript\">\n";
|
||||||
|
echo $this->m_sReadyScript; // Ready Scripts are output as simple scripts
|
||||||
|
echo "\n</script>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trim($s_captured_output) != "")
|
||||||
|
{
|
||||||
|
echo self::FilterXSS($s_captured_output);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (class_exists('DBSearch'))
|
||||||
|
{
|
||||||
|
DBSearch::RecordQueryTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a paragraph with a smaller font into the page
|
||||||
|
* NOT implemented (i.e does nothing)
|
||||||
|
* @param string $sText Content of the (small) paragraph
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function small_p($sText)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public function add($sHtml)
|
||||||
|
{
|
||||||
|
if (($this->m_oTabs->GetCurrentTabContainer() != '') && ($this->m_oTabs->GetCurrentTab() != ''))
|
||||||
|
{
|
||||||
|
$this->m_oTabs->AddToTab($this->m_oTabs->GetCurrentTabContainer(), $this->m_oTabs->GetCurrentTab(), $sHtml);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
parent::add($sHtml);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Records the current state of the 'html' part of the page output
|
||||||
|
* @return mixed The current state of the 'html' output
|
||||||
|
*/
|
||||||
|
public function start_capture()
|
||||||
|
{
|
||||||
|
$sCurrentTabContainer = $this->m_oTabs->GetCurrentTabContainer();
|
||||||
|
$sCurrentTab = $this->m_oTabs->GetCurrentTab();
|
||||||
|
|
||||||
|
if (!empty($sCurrentTabContainer) && !empty($sCurrentTab))
|
||||||
|
{
|
||||||
|
$iOffset = $this->m_oTabs->GetCurrentTabLength();
|
||||||
|
return array('tc' => $sCurrentTabContainer, 'tab' => $sCurrentTab, 'offset' => $iOffset);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return parent::start_capture();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the part of the html output that occurred since the call to start_capture
|
||||||
|
* and removes this part from the current html output
|
||||||
|
* @param $offset mixed The value returned by start_capture
|
||||||
|
* @return string The part of the html output that was added since the call to start_capture
|
||||||
|
*/
|
||||||
|
public function end_capture($offset)
|
||||||
|
{
|
||||||
|
if (is_array($offset))
|
||||||
|
{
|
||||||
|
if ($this->m_oTabs->TabExists($offset['tc'], $offset['tab']))
|
||||||
|
{
|
||||||
|
$sCaptured = $this->m_oTabs->TruncateTab($offset['tc'], $offset['tab'], $offset['offset']);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sCaptured = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sCaptured = parent::end_capture($offset);
|
||||||
|
}
|
||||||
|
return $sCaptured;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add any text or HTML fragment (identified by an ID) at the end of the body of the page
|
||||||
|
* This is useful to add hidden content, DIVs or FORMs that should not
|
||||||
|
* be embedded into each other.
|
||||||
|
*/
|
||||||
|
public function add_at_the_end($s_html, $sId = '')
|
||||||
|
{
|
||||||
|
if ($sId != '')
|
||||||
|
{
|
||||||
|
$this->add_script("$('#{$sId}').remove();"); // Remove any previous instance of the same Id
|
||||||
|
}
|
||||||
|
$this->s_deferred_content .= $s_html;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a script to be executed when the DOM is ready (typical JQuery use)
|
||||||
|
* NOT implemented in this version of the class.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function add_ready_script($sScript)
|
||||||
|
{
|
||||||
|
$this->m_sReadyScript .= $sScript."\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cannot be called in this context, since Ajax pages do not share
|
||||||
|
* any context with the calling page !!
|
||||||
|
*/
|
||||||
|
public function GetUniqueId()
|
||||||
|
{
|
||||||
|
assert(false);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function FilterXSS($sHTML)
|
||||||
|
{
|
||||||
|
return str_ireplace(array('<script', '</script>'), array('<!-- <removed-script', '</removed-script> -->'), $sHTML);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,19 +1,41 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
// Copyright (C) 2010-2012 Combodo SARL
|
||||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
//
|
||||||
* @license http://opensource.org/licenses/AGPL-3.0
|
// 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
|
||||||
* Includes all the classes to have the application up and running
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
*/
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
require_once(APPROOT.'/application/applicationcontext.class.inc.php');
|
// iTop is distributed in the hope that it will be useful,
|
||||||
require_once(APPROOT.'/application/cmdbabstract.class.inc.php');
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
require_once(APPROOT.'/application/displayblock.class.inc.php');
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
require_once(APPROOT.'/application/audit.category.class.inc.php');
|
// GNU Affero General Public License for more details.
|
||||||
require_once(APPROOT.'/application/audit.domain.class.inc.php');
|
//
|
||||||
require_once(APPROOT.'/application/audit.rule.class.inc.php');
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
require_once(APPROOT.'/application/query.class.inc.php');
|
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||||
require_once(APPROOT.'/setup/moduleinstallation.class.inc.php');
|
|
||||||
require_once(APPROOT.'/application/utils.inc.php');
|
|
||||||
|
/**
|
||||||
|
* Includes all the classes to have the application up and running
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2010-2012 Combodo SARL
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once(APPROOT.'/application/applicationcontext.class.inc.php');
|
||||||
|
require_once(APPROOT.'/application/cmdbabstract.class.inc.php');
|
||||||
|
require_once(APPROOT.'/application/displayblock.class.inc.php');
|
||||||
|
require_once(APPROOT.'/application/sqlblock.class.inc.php');
|
||||||
|
require_once(APPROOT.'/application/audit.category.class.inc.php');
|
||||||
|
require_once(APPROOT.'/application/audit.rule.class.inc.php');
|
||||||
|
require_once(APPROOT.'/application/query.class.inc.php');
|
||||||
|
require_once(APPROOT.'/setup/moduleinstallation.class.inc.php');
|
||||||
|
//require_once(APPROOT.'/application/menunode.class.inc.php');
|
||||||
|
require_once(APPROOT.'/application/utils.inc.php');
|
||||||
|
|
||||||
|
class ApplicationException extends CoreException
|
||||||
|
{
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|||||||
@@ -1,459 +1,362 @@
|
|||||||
<?php
|
<?php
|
||||||
// Copyright (C) 2010-2024 Combodo SAS
|
// Copyright (C) 2010-2012 Combodo SARL
|
||||||
//
|
//
|
||||||
// This file is part of iTop.
|
// This file is part of iTop.
|
||||||
//
|
//
|
||||||
// iTop is free software; you can redistribute it and/or modify
|
// 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
|
// 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
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
// (at your option) any later version.
|
// (at your option) any later version.
|
||||||
//
|
//
|
||||||
// iTop is distributed in the hope that it will be useful,
|
// iTop is distributed in the hope that it will be useful,
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
// GNU Affero General Public License for more details.
|
// GNU Affero General Public License for more details.
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class ApplicationContext
|
* Class ApplicationContext
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
* @copyright Copyright (C) 2010-2012 Combodo SARL
|
||||||
* @license http://opensource.org/licenses/AGPL-3.0
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Combodo\iTop\Application\Helper\Session;
|
require_once(APPROOT."/application/utils.inc.php");
|
||||||
use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
|
|
||||||
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock;
|
/**
|
||||||
use Combodo\iTop\Application\UI\Base\UIBlock;
|
* Interface for directing end-users to the relevant application
|
||||||
|
*/
|
||||||
require_once(APPROOT."/application/utils.inc.php");
|
interface iDBObjectURLMaker
|
||||||
|
{
|
||||||
/**
|
public static function MakeObjectURL($sClass, $iId);
|
||||||
* Interface for directing end-users to the relevant application
|
}
|
||||||
*/
|
|
||||||
interface iDBObjectURLMaker
|
/**
|
||||||
{
|
* Direct end-users to the standard iTop application: UI.php
|
||||||
/**
|
*/
|
||||||
* @param string $sClass
|
class iTopStandardURLMaker implements iDBObjectURLMaker
|
||||||
* @param string $iId
|
{
|
||||||
*
|
public static function MakeObjectURL($sClass, $iId)
|
||||||
* @return string
|
{
|
||||||
*/
|
$sPage = DBObject::ComputeStandardUIPage($sClass);
|
||||||
public static function MakeObjectURL($sClass, $iId);
|
$sAbsoluteUrl = utils::GetAbsoluteUrlAppRoot();
|
||||||
}
|
$sUrl = "{$sAbsoluteUrl}pages/$sPage?operation=details&class=$sClass&id=$iId";
|
||||||
|
return $sUrl;
|
||||||
/**
|
}
|
||||||
* Direct end-users to the standard iTop application: UI.php
|
}
|
||||||
*/
|
|
||||||
class iTopStandardURLMaker implements iDBObjectURLMaker
|
/**
|
||||||
{
|
* Direct end-users to the standard Portal application
|
||||||
/**
|
*/
|
||||||
* @param string $sClass
|
class PortalURLMaker implements iDBObjectURLMaker
|
||||||
* @param string $iId
|
{
|
||||||
*
|
public static function MakeObjectURL($sClass, $iId)
|
||||||
* @return string
|
{
|
||||||
* @throws \Exception
|
$sAbsoluteUrl = utils::GetAbsoluteUrlAppRoot();
|
||||||
*/
|
$sUrl = "{$sAbsoluteUrl}portal/index.php?operation=details&class=$sClass&id=$iId";
|
||||||
public static function MakeObjectURL($sClass, $iId)
|
return $sUrl;
|
||||||
{
|
}
|
||||||
$sPage = DBObject::ComputeStandardUIPage($sClass);
|
}
|
||||||
$sAbsoluteUrl = utils::GetAbsoluteUrlAppRoot();
|
|
||||||
$sUrl = "{$sAbsoluteUrl}pages/$sPage?operation=details&class=$sClass&id=$iId";
|
|
||||||
return $sUrl;
|
/**
|
||||||
}
|
* Helper class to store and manipulate the parameters that make the application's context
|
||||||
}
|
*
|
||||||
|
* Usage:
|
||||||
/**
|
* 1) Build the application's context by constructing the object
|
||||||
* Direct end-users to the standard Portal application
|
* (the object will read some of the page's parameters)
|
||||||
*/
|
*
|
||||||
class PortalURLMaker implements iDBObjectURLMaker
|
* 2) Add these parameters to hyperlinks or to forms using the helper, functions
|
||||||
{
|
* GetForLink(), GetForForm() or GetAsHash()
|
||||||
/**
|
*/
|
||||||
* @param string $sClass
|
class ApplicationContext
|
||||||
* @param string $iId
|
{
|
||||||
*
|
protected $aNames;
|
||||||
* @return string
|
protected $aValues;
|
||||||
* @throws \Exception
|
protected static $aDefaultValues; // Cache shared among all instances
|
||||||
*/
|
|
||||||
public static function MakeObjectURL($sClass, $iId)
|
public function __construct($bReadContext = true)
|
||||||
{
|
{
|
||||||
$sAbsoluteUrl = utils::GetAbsoluteUrlAppRoot();
|
$this->aNames = array(
|
||||||
$sUrl = "{$sAbsoluteUrl}portal/index.php?operation=details&class=$sClass&id=$iId";
|
'org_id', 'menu'
|
||||||
return $sUrl;
|
);
|
||||||
}
|
if ($bReadContext)
|
||||||
}
|
{
|
||||||
|
$this->ReadContext();
|
||||||
|
}
|
||||||
/**
|
|
||||||
* Helper class to store and manipulate the parameters that make the application's context
|
}
|
||||||
*
|
|
||||||
* Usage:
|
/**
|
||||||
* 1) Build the application's context by constructing the object
|
* Read the context directly in the PHP parameters (either POST or GET)
|
||||||
* (the object will read some of the page's parameters)
|
* return nothing
|
||||||
*
|
*/
|
||||||
* 2) Add these parameters to hyperlinks or to forms using the helper, functions
|
protected function ReadContext()
|
||||||
* GetForLink(), GetForForm() or GetAsHash()
|
{
|
||||||
*/
|
if (!isset(self::$aDefaultValues))
|
||||||
class ApplicationContext
|
{
|
||||||
{
|
self::$aDefaultValues = array();
|
||||||
public static $m_sUrlMakerClass = null;
|
$aContext = utils::ReadParam('c', array(), false, 'context_param');
|
||||||
protected static $m_aPluginProperties = null;
|
foreach($this->aNames as $sName)
|
||||||
protected static $aDefaultValues; // Cache shared among all instances
|
{
|
||||||
|
$sValue = isset($aContext[$sName]) ? $aContext[$sName] : '';
|
||||||
protected $aNames;
|
// TO DO: check if some of the context parameters are mandatory (or have default values)
|
||||||
protected $aValues;
|
if (!empty($sValue))
|
||||||
|
{
|
||||||
/**
|
self::$aDefaultValues[$sName] = $sValue;
|
||||||
* ApplicationContext constructor.
|
}
|
||||||
*
|
// Hmm, there must be a better (more generic) way to handle the case below:
|
||||||
* @param bool $bReadContext
|
// When there is only one possible (allowed) organization, the context must be
|
||||||
*
|
// fixed to this org
|
||||||
* @throws \Exception
|
if ($sName == 'org_id')
|
||||||
*/
|
{
|
||||||
public function __construct($bReadContext = true)
|
if (MetaModel::IsValidClass('Organization'))
|
||||||
{
|
{
|
||||||
$this->aNames = array(
|
$oSearchFilter = new DBObjectSearch('Organization');
|
||||||
'org_id', 'menu'
|
$oSearchFilter->SetModifierProperty('UserRightsGetSelectFilter', 'bSearchMode', true);
|
||||||
);
|
$oSet = new CMDBObjectSet($oSearchFilter);
|
||||||
if ($bReadContext)
|
$iCount = $oSet->Count();
|
||||||
{
|
if ($iCount == 1)
|
||||||
$this->ReadContext();
|
{
|
||||||
}
|
// Only one possible value for org_id, set it in the context
|
||||||
|
$oOrg = $oSet->Fetch();
|
||||||
}
|
self::$aDefaultValues[$sName] = $oOrg->GetKey();
|
||||||
|
}
|
||||||
/**
|
}
|
||||||
* Read the context directly in the PHP parameters (either POST or GET)
|
}
|
||||||
* return nothing
|
}
|
||||||
*
|
}
|
||||||
* @throws \Exception
|
$this->aValues = self::$aDefaultValues;
|
||||||
*/
|
}
|
||||||
protected function ReadContext()
|
|
||||||
{
|
/**
|
||||||
if (!isset(self::$aDefaultValues))
|
* Returns the current value for the given parameter
|
||||||
{
|
* @param string $sParamName Name of the parameter to read
|
||||||
self::$aDefaultValues = array();
|
* @return mixed The value for this parameter
|
||||||
$aContext = utils::ReadParam('c', array(), false, 'context_param');
|
*/
|
||||||
foreach($this->aNames as $sName)
|
public function GetCurrentValue($sParamName, $defaultValue = '')
|
||||||
{
|
{
|
||||||
$sValue = isset($aContext[$sName]) ? $aContext[$sName] : '';
|
if (isset($this->aValues[$sParamName]))
|
||||||
// TO DO: check if some of the context parameters are mandatory (or have default values)
|
{
|
||||||
if (!empty($sValue))
|
return $this->aValues[$sParamName];
|
||||||
{
|
}
|
||||||
self::$aDefaultValues[$sName] = $sValue;
|
return $defaultValue;
|
||||||
}
|
}
|
||||||
// Hmm, there must be a better (more generic) way to handle the case below:
|
|
||||||
// When there is only one possible (allowed) organization, the context must be
|
/**
|
||||||
// fixed to this org unless there is only one organization in the system then
|
* Returns the context as string with the format name1=value1&name2=value2....
|
||||||
// no filter is applied
|
* return string The context as a string to be appended to an href property
|
||||||
if ($sName == 'org_id')
|
*/
|
||||||
{
|
public function GetForLink()
|
||||||
if (MetaModel::IsValidClass('Organization'))
|
{
|
||||||
{
|
$aParams = array();
|
||||||
$oSearchFilter = new DBObjectSearch('Organization');
|
foreach($this->aValues as $sName => $sValue)
|
||||||
$oSet = new CMDBObjectSet($oSearchFilter);
|
{
|
||||||
$iCount = $oSet->CountWithLimit(2);
|
$aParams[] = "c[$sName]".'='.urlencode($sValue);
|
||||||
if ($iCount > 1)
|
}
|
||||||
{
|
return implode("&", $aParams);
|
||||||
$oSearchFilter->SetModifierProperty('UserRightsGetSelectFilter', 'bSearchMode', true);
|
}
|
||||||
$oSet = new CMDBObjectSet($oSearchFilter);
|
|
||||||
$iCount = $oSet->CountWithLimit(2);
|
/**
|
||||||
if ($iCount == 1)
|
* Returns the context as sequence of input tags to be inserted inside a <form> tag
|
||||||
{
|
* return string The context as a sequence of <input type="hidden" /> tags
|
||||||
// Only one possible value for org_id, set it in the context
|
*/
|
||||||
$oOrg = $oSet->Fetch();
|
public function GetForForm()
|
||||||
self::$aDefaultValues[$sName] = $oOrg->GetKey();
|
{
|
||||||
}
|
$sContext = "";
|
||||||
}
|
foreach($this->aValues as $sName => $sValue)
|
||||||
}
|
{
|
||||||
}
|
$sContext .= "<input type=\"hidden\" name=\"c[$sName]\" value=\"".htmlentities($sValue, ENT_QUOTES, 'UTF-8')."\" />\n";
|
||||||
}
|
}
|
||||||
}
|
return $sContext;
|
||||||
$this->aValues = self::$aDefaultValues;
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
/**
|
* Returns the context as a hash array 'parameter_name' => value
|
||||||
* Returns the current value for the given parameter
|
* return array The context information
|
||||||
*
|
*/
|
||||||
* @param string $sParamName Name of the parameter to read
|
public function GetAsHash()
|
||||||
* @param string $defaultValue
|
{
|
||||||
*
|
$aReturn = array();
|
||||||
* @return mixed The value for this parameter
|
foreach($this->aValues as $sName => $sValue)
|
||||||
*/
|
{
|
||||||
public function GetCurrentValue($sParamName, $defaultValue = '')
|
$aReturn["c[$sName]"] = $sValue;
|
||||||
{
|
}
|
||||||
if (isset($this->aValues[$sParamName]))
|
return $aReturn;
|
||||||
{
|
}
|
||||||
return $this->aValues[$sParamName];
|
|
||||||
}
|
/**
|
||||||
return $defaultValue;
|
* Returns an array of the context parameters NAMEs
|
||||||
}
|
* @return array The list of context parameters
|
||||||
|
*/
|
||||||
/**
|
public function GetNames()
|
||||||
* Returns the context as string with the format name1=value1&name2=value2....
|
{
|
||||||
* @return string The context as a string to be appended to an href property
|
return $this->aNames;
|
||||||
*
|
}
|
||||||
*/
|
/**
|
||||||
public function GetForLink(bool $bWithLeadingAmpersand = false)
|
* Removes the specified parameter from the context, for example when the same parameter
|
||||||
{
|
* is already a search parameter
|
||||||
// If there are no parameters, return an empty string
|
* @param string $sParamName Name of the parameter to remove
|
||||||
if(empty($this->aValues)){
|
* @return none
|
||||||
return '';
|
*/
|
||||||
}
|
public function Reset($sParamName)
|
||||||
|
{
|
||||||
// Build the query string with ampersand separated parameters
|
if (isset($this->aValues[$sParamName]))
|
||||||
$aParams = array();
|
{
|
||||||
foreach($this->aValues as $sName => $sValue)
|
unset($this->aValues[$sParamName]);
|
||||||
{
|
}
|
||||||
$aParams[] = "c[$sName]".'='.urlencode($sValue);
|
}
|
||||||
}
|
|
||||||
$sReturnValue = implode('&', $aParams);
|
/**
|
||||||
|
* Initializes the given object with the default values provided by the context
|
||||||
// add the leading ampersand if requested
|
*/
|
||||||
if($bWithLeadingAmpersand){
|
public function InitObjectFromContext(DBObject &$oObj)
|
||||||
$sReturnValue = '&' . $sReturnValue;
|
{
|
||||||
}
|
$sClass = get_class($oObj);
|
||||||
|
foreach($this->GetNames() as $key)
|
||||||
return $sReturnValue;
|
{
|
||||||
}
|
$aCallSpec = array($sClass, 'MapContextParam');
|
||||||
|
if (is_callable($aCallSpec))
|
||||||
/**
|
{
|
||||||
* @since 3.0.0 N°2534 - dashboard: bug with autorefresh that deactivates filtering on organisation
|
$sAttCode = call_user_func($aCallSpec, $key); // Returns null when there is no mapping for this parameter
|
||||||
* Returns the params as c[menu]:..., c[org_id]:....
|
|
||||||
* @return string The params
|
if (MetaModel::IsValidAttCode($sClass, $sAttCode))
|
||||||
*/
|
{
|
||||||
public function GetForPostParams()
|
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
|
||||||
{
|
if ($oAttDef->IsWritable())
|
||||||
return json_encode($this->aValues);
|
{
|
||||||
}
|
$value = $this->GetCurrentValue($key, null);
|
||||||
|
if (!is_null($value))
|
||||||
/**
|
{
|
||||||
* Returns the context as sequence of input tags to be inserted inside a <form> tag
|
$oObj->Set($sAttCode, $value);
|
||||||
*
|
}
|
||||||
* @return string The context as a sequence of <input type="hidden" /> tags
|
}
|
||||||
*/
|
}
|
||||||
public function GetForForm()
|
}
|
||||||
{
|
}
|
||||||
$sContext = "";
|
}
|
||||||
foreach ($this->aValues as $sName => $sValue) {
|
|
||||||
$sContext .= "<input type=\"hidden\" name=\"c[$sName]\" value=\"".utils::EscapeHtml($sValue)."\" />\n";
|
static $m_sUrlMakerClass = null;
|
||||||
}
|
|
||||||
return $sContext;
|
/**
|
||||||
}
|
* Set the current application url provider
|
||||||
/**
|
* @param sClass string Class implementing iDBObjectURLMaker
|
||||||
* Returns the context an array of input blocks
|
* @return void
|
||||||
*
|
*/
|
||||||
* @return array The context as a sequence of <input type="hidden" /> tags
|
public static function SetUrlMakerClass($sClass = 'iTopStandardURLMaker')
|
||||||
* @since 3.0.0
|
{
|
||||||
*/
|
$sPrevious = self::GetUrlMakerClass();
|
||||||
public function GetForUIForm()
|
|
||||||
{
|
self::$m_sUrlMakerClass = $sClass;
|
||||||
$aContextInputBlocks = [];
|
$_SESSION['UrlMakerClass'] = $sClass;
|
||||||
foreach ($this->aValues as $sName => $sValue) {
|
|
||||||
$aContextInputBlocks[] = InputUIBlockFactory::MakeForHidden("c[$sName]", $sValue);
|
return $sPrevious;
|
||||||
}
|
}
|
||||||
return $aContextInputBlocks;
|
|
||||||
}
|
/**
|
||||||
|
* Get the current application url provider
|
||||||
/**
|
* @return string the name of the class
|
||||||
* Returns the context as sequence of input tags to be inserted inside a <form> tag
|
*/
|
||||||
*
|
public static function GetUrlMakerClass()
|
||||||
*/
|
{
|
||||||
public function GetForFormBlock(): UIBlock
|
if (is_null(self::$m_sUrlMakerClass))
|
||||||
{
|
{
|
||||||
$oContext = new UIContentBlock();
|
if (isset($_SESSION['UrlMakerClass']))
|
||||||
foreach ($this->aValues as $sName => $sValue) {
|
{
|
||||||
$oContext->AddSubBlock(InputUIBlockFactory::MakeForHidden('c[$sName]', utils::HtmlEntities($sValue)));
|
self::$m_sUrlMakerClass = $_SESSION['UrlMakerClass'];
|
||||||
}
|
}
|
||||||
return $oContext;
|
else
|
||||||
}
|
{
|
||||||
|
self::$m_sUrlMakerClass = 'iTopStandardURLMaker';
|
||||||
/**
|
}
|
||||||
* Returns the context as a hash array 'parameter_name' => value
|
}
|
||||||
*
|
return self::$m_sUrlMakerClass;
|
||||||
* @return array The context information
|
}
|
||||||
*/
|
|
||||||
public function GetAsHash()
|
/**
|
||||||
{
|
* Get the current application url provider
|
||||||
$aReturn = array();
|
* @return string the name of the class
|
||||||
foreach($this->aValues as $sName => $sValue)
|
*/
|
||||||
{
|
public static function MakeObjectUrl($sObjClass, $sObjKey, $sUrlMakerClass = null, $bWithNavigationContext = true)
|
||||||
$aReturn["c[$sName]"] = $sValue;
|
{
|
||||||
}
|
$oAppContext = new ApplicationContext();
|
||||||
return $aReturn;
|
|
||||||
}
|
if (is_null($sUrlMakerClass))
|
||||||
|
{
|
||||||
/**
|
$sUrlMakerClass = self::GetUrlMakerClass();
|
||||||
* Returns an array of the context parameters NAMEs
|
}
|
||||||
* @return array The list of context parameters
|
$sUrl = call_user_func(array($sUrlMakerClass, 'MakeObjectUrl'), $sObjClass, $sObjKey);
|
||||||
*/
|
if (strlen($sUrl) > 0)
|
||||||
public function GetNames()
|
{
|
||||||
{
|
if ($bWithNavigationContext)
|
||||||
return $this->aNames;
|
{
|
||||||
}
|
return $sUrl."&".$oAppContext->GetForLink();
|
||||||
/**
|
}
|
||||||
* Removes the specified parameter from the context, for example when the same parameter
|
else
|
||||||
* is already a search parameter
|
{
|
||||||
* @param string $sParamName Name of the parameter to remove
|
return $sUrl;
|
||||||
*/
|
}
|
||||||
public function Reset($sParamName)
|
}
|
||||||
{
|
else
|
||||||
if (isset($this->aValues[$sParamName]))
|
{
|
||||||
{
|
return '';
|
||||||
unset($this->aValues[$sParamName]);
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
protected static $m_aPluginProperties = null;
|
||||||
/**
|
|
||||||
* Initializes the given object with the default values provided by the context
|
/**
|
||||||
*
|
* Load plugin properties for the current session
|
||||||
* @param \DBObject $oObj
|
* @return void
|
||||||
*
|
*/
|
||||||
* @throws \Exception
|
protected static function LoadPluginProperties()
|
||||||
* @throws \CoreUnexpectedValue
|
{
|
||||||
*/
|
if (isset($_SESSION['PluginProperties']))
|
||||||
public function InitObjectFromContext(DBObject &$oObj)
|
{
|
||||||
{
|
self::$m_aPluginProperties = $_SESSION['PluginProperties'];
|
||||||
$sClass = get_class($oObj);
|
}
|
||||||
foreach($this->GetNames() as $key)
|
else
|
||||||
{
|
{
|
||||||
$aCallSpec = array($sClass, 'MapContextParam');
|
self::$m_aPluginProperties = array();
|
||||||
if (is_callable($aCallSpec))
|
}
|
||||||
{
|
}
|
||||||
$sAttCode = call_user_func($aCallSpec, $key); // Returns null when there is no mapping for this parameter
|
|
||||||
|
/**
|
||||||
if (MetaModel::IsValidAttCode($sClass, $sAttCode))
|
* Set plugin properties
|
||||||
{
|
* @param sPluginClass string Class implementing any plugin interface
|
||||||
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
|
* @param sProperty string Name of the property
|
||||||
if ($oAttDef->IsWritable())
|
* @param value scalar Value (numeric or string)
|
||||||
{
|
* @return void
|
||||||
$value = $this->GetCurrentValue($key, null);
|
*/
|
||||||
if (!is_null($value))
|
public static function SetPluginProperty($sPluginClass, $sProperty, $value)
|
||||||
{
|
{
|
||||||
$oObj->Set($sAttCode, $value);
|
if (is_null(self::$m_aPluginProperties)) self::LoadPluginProperties();
|
||||||
}
|
|
||||||
}
|
self::$m_aPluginProperties[$sPluginClass][$sProperty] = $value;
|
||||||
}
|
$_SESSION['PluginProperties'][$sPluginClass][$sProperty] = $value;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
/**
|
||||||
|
* Get plugin properties
|
||||||
/**
|
* @param sPluginClass string Class implementing any plugin interface
|
||||||
* Set the current application url provider
|
* @return array of sProperty=>value pairs
|
||||||
* @param string $sClass Class implementing iDBObjectURLMaker
|
*/
|
||||||
* @return string
|
public static function GetPluginProperties($sPluginClass)
|
||||||
*/
|
{
|
||||||
public static function SetUrlMakerClass($sClass = 'iTopStandardURLMaker')
|
if (is_null(self::$m_aPluginProperties)) self::LoadPluginProperties();
|
||||||
{
|
|
||||||
$sPrevious = self::GetUrlMakerClass();
|
if (array_key_exists($sPluginClass, self::$m_aPluginProperties))
|
||||||
|
{
|
||||||
self::$m_sUrlMakerClass = $sClass;
|
return self::$m_aPluginProperties[$sPluginClass];
|
||||||
Session::Set('UrlMakerClass', $sClass);
|
}
|
||||||
|
else
|
||||||
return $sPrevious;
|
{
|
||||||
}
|
return array();
|
||||||
|
}
|
||||||
/**
|
}
|
||||||
* Get the current application url provider
|
|
||||||
* @return string the name of the class
|
}
|
||||||
*/
|
?>
|
||||||
public static function GetUrlMakerClass()
|
|
||||||
{
|
|
||||||
if (is_null(self::$m_sUrlMakerClass))
|
|
||||||
{
|
|
||||||
if (Session::IsSet('UrlMakerClass'))
|
|
||||||
{
|
|
||||||
self::$m_sUrlMakerClass = Session::Get('UrlMakerClass');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
self::$m_sUrlMakerClass = 'iTopStandardURLMaker';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return self::$m_sUrlMakerClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the current application url provider
|
|
||||||
*
|
|
||||||
* @param string $sObjClass
|
|
||||||
* @param string $sObjKey
|
|
||||||
* @param null $sUrlMakerClass
|
|
||||||
* @param bool $bWithNavigationContext
|
|
||||||
*
|
|
||||||
* @return string the name of the class
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
public static function MakeObjectUrl($sObjClass, $sObjKey, $sUrlMakerClass = null, $bWithNavigationContext = true)
|
|
||||||
{
|
|
||||||
$oAppContext = new ApplicationContext();
|
|
||||||
|
|
||||||
if (is_null($sUrlMakerClass)) {
|
|
||||||
$sUrlMakerClass = self::GetUrlMakerClass();
|
|
||||||
}
|
|
||||||
$sUrl = call_user_func(array($sUrlMakerClass, 'MakeObjectUrl'), $sObjClass, $sObjKey);
|
|
||||||
if (utils::StrLen($sUrl) > 0) {
|
|
||||||
if ($bWithNavigationContext) {
|
|
||||||
return $sUrl.$oAppContext->GetForLink(true);
|
|
||||||
} else {
|
|
||||||
return $sUrl;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load plugin properties for the current session
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
protected static function LoadPluginProperties()
|
|
||||||
{
|
|
||||||
if (Session::IsSet('PluginProperties'))
|
|
||||||
{
|
|
||||||
self::$m_aPluginProperties = Session::Get('PluginProperties');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
self::$m_aPluginProperties = array();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set plugin properties
|
|
||||||
* @param string $sPluginClass Class implementing any plugin interface
|
|
||||||
* @param string $sProperty Name of the property
|
|
||||||
* @param mixed $value Value (numeric or string)
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function SetPluginProperty($sPluginClass, $sProperty, $value)
|
|
||||||
{
|
|
||||||
if (is_null(self::$m_aPluginProperties)) self::LoadPluginProperties();
|
|
||||||
|
|
||||||
self::$m_aPluginProperties[$sPluginClass][$sProperty] = $value;
|
|
||||||
Session::Set(['PluginProperties', $sPluginClass, $sProperty], $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get plugin properties
|
|
||||||
* @param string $sPluginClass Class implementing any plugin interface
|
|
||||||
* @return array of sProperty=>value pairs
|
|
||||||
*/
|
|
||||||
public static function GetPluginProperties($sPluginClass)
|
|
||||||
{
|
|
||||||
if (is_null(self::$m_aPluginProperties)) self::LoadPluginProperties();
|
|
||||||
|
|
||||||
if (array_key_exists($sPluginClass, self::$m_aPluginProperties))
|
|
||||||
{
|
|
||||||
return self::$m_aPluginProperties[$sPluginClass];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,72 +0,0 @@
|
|||||||
<?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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<?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
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,150 +0,0 @@
|
|||||||
<?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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class for adding an item as a button that runs some JS code
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package UIExtensibilityAPI
|
|
||||||
* @since 2.0
|
|
||||||
*/
|
|
||||||
class JSButtonItem extends JSPopupMenuItem
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
<?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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<?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
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,173 +0,0 @@
|
|||||||
<?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);
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?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;
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user