Compare commits

...

104 Commits

Author SHA1 Message Date
jf-cbd
11fba06d58 📝 Update README.md 2026-09-29 11:15:35 +02:00
jf-cbd
7908f67be0 📝 Remove SourceForge links 2026-09-29 11:13:30 +02:00
Stephen Abello
220d6df86a Merge branch 'support/3.3' into develop 2026-09-29 10:04:21 +02:00
Stephen Abello
67c6a0732c Merge branch 'support/3.2' into support/3.3 2026-09-29 10:03:43 +02:00
Stephen Abello
a2a00cb582 N°10075 - Update configuration parameters default value (#1055) 2026-09-29 10:02:57 +02:00
Molkobain
8dd2f2d7e9 💚 Fix typo in XML file 2026-09-29 08:36:47 +02:00
jf-cbd
4cfc1c2153 Merge remote-tracking branch 'origin/support/3.3' into develop 2026-09-28 11:41:03 +02:00
jf-cbd
4e8d34bb23 Merge remote-tracking branch 'origin/support/3.2' into support/3.3 2026-09-28 11:40:24 +02:00
jf-cbd
4d699f79e8 Add unit test for N°9740 2026-09-28 11:30:54 +02:00
Molkobain
28cb200e63 💚 Update datamodel files version to 3.4 2026-09-28 10:08:31 +02:00
Molkobain
fcd66bed2a 💬 Update version to 3.4.0 2026-09-27 18:03:10 +02:00
Molkobain
58d74f1521 Merge remote-tracking branch 'origin/support/3.3' into develop 2026-09-27 17:56:23 +02:00
Molkobain
4e70886d2a 💬 Update version to 3.3.1 2026-09-27 17:55:49 +02:00
Stephen Abello
f9c94e9c62 Merge branch 'support/3.3' into develop 2026-09-25 10:29:37 +02:00
Stephen Abello
c2929ecd33 Merge branch 'support/3.2' into support/3.3 2026-09-25 10:28:55 +02:00
Stephen Abello
873cea1a76 N°9557 - Small improvement to shortcut preferences (#1049)
* N°9557 - Small improvement to shortcut preferences

* Apply code review suggestions
2026-09-25 10:28:05 +02:00
jf-cbd
f637669336 Merge remote-tracking branch 'origin/support/3.3' into develop 2026-09-21 09:50:51 +02:00
jf-cbd
b7432b9e60 Merge remote-tracking branch 'origin/support/3.2' into support/3.3 2026-09-21 09:50:18 +02:00
jf-cbd
b4386b0ce6 Merge remote-tracking branch 'origin/support/3.2' into develop 2026-09-18 15:43:24 +02:00
jf-cbd
adc2596b4a Issue/9740 fix attachment removal (#1052)
(cherry picked from commit af972313d7)
2026-09-18 15:40:52 +02:00
jf-cbd
af972313d7 Issue/9740 fix attachment removal (#1052) 2026-09-18 14:05:06 +02:00
jf-cbd
d051d51699 Update and rename action.yml to add-to-dashboard.yml 2026-09-16 11:50:58 +02:00
Denis
16d68fe993 Version 3.3.0 2026-09-15 15:29:07 +02:00
Molkobain
4e1bf80b9f Merge remote-tracking branch 'origin/support/3.2' into develop 2026-09-15 10:17:15 +02:00
Molkobain
2ac4229ee0 N°10070 - Loss of DroidSansFallback font which impacts exports in east asian character sets (#1048)
* N°10070 - Loss of DroidSansFallback font which impacts exports in east asian character sets

* N°10070 - Add unit test
2026-09-15 10:03:52 +02:00
Timmy38
e6d485855e N°10045 Fix modules in production-modules automatically set to visible false 2026-09-14 16:34:40 +02:00
Stephen Abello
ab9d270b62 Merge branch 'support/3.2' into develop 2026-09-14 09:54:17 +02:00
Stephen Abello
4a6af15237 N°10041 - Fullscreen CKeditor in a modal can't take the focus (#1043) 2026-09-14 09:52:21 +02:00
jf-cbd
05e585ced3 📝 Update enhancement.yml and pull_request_template.md 2026-09-11 16:57:45 +02:00
lenaick.moreira
9e4f2a3053 RC 3.3 Update contributors 2026-09-04 15:14:44 +02:00
Benjamin DALSASS
a8b7622110 RC 3.3 - Update dictionnaries (not supported languages lt et) 2026-09-04 11:54:24 +02:00
Benjamin DALSASS
c241c257a5 RC 3.3 - Update dictionnaries (CS Fixer) 2026-09-04 11:05:03 +02:00
Benjamin DALSASS
ffa2a6dfd4 RC 3.3 - Update dictionnaries
RC 3.3 - Update dictionnaries
2026-09-04 10:32:51 +02:00
jf-cbd
5d99042d4c 📝 Update enhancement.yml and pull_request_template.md 2026-09-04 10:25:01 +02:00
Stephen Abello
8ff57dabd0 Dump setup.css 2026-09-04 10:24:33 +02:00
Stephen Abello
b9a7923a40 Merge branch 'support/3.2' into develop 2026-09-04 10:22:40 +02:00
Stephen Abello
6c1206658e N°9916 - Fix menu notification indicator position on Firefox 2026-09-04 10:22:19 +02:00
odain-cbd
1a395f4b50 N°10006 - fix audit display in case of no fields provided (#1039) 2026-09-04 10:07:05 +02:00
Benjamin DALSASS
0ae3bc2821 RC 3.3 - Update libraries licences 2026-09-04 09:37:12 +02:00
Benjamin DALSASS
98a007ff9c N°10002 - Any CI creation in pop-up fails due to "groups_list_operations" not handled 2026-09-04 07:43:45 +02:00
odain-cbd
ee17738e8e N°10006 - Incorrect display of audit errors in iTOP (#1037)
* N°10006 - Incorrect display of audit errors in iTOP - fix export-v2 from audit

* N°10006 - Incorrect display of audit errors in iTOP - fix export-v2 from audit

* N°10006 - handle no class allowed in read corner case

* N°1006 - fix export-v2 with OQLRequest and without fields
2026-09-03 15:02:12 +02:00
Timmy38
da62814e67 N°10021 Fix code style 2026-09-03 10:26:57 +02:00
Timmy38
aef80d60a8 N°10021 Fix handling of removed extension that are also part of product 2026-09-03 10:13:49 +02:00
Timmy38
5597040a8a N°9334 Change extension source label 2026-09-02 15:28:21 +02:00
Eric Espie
7d89a05d8b N°9981 - Offline MTP fail on iTop3.3.0 2026-09-02 14:59:18 +02:00
jf-cbd
ddc3fd8fd1 N°7968 - Renaming column can cause problem when index exists, adding a fallback to the previous method in this specific case 2026-09-02 11:46:40 +02:00
Stephen Abello
59af2e8b96 Merge branch 'support/3.2' into develop 2026-09-02 10:14:27 +02:00
Stephen Abello
7d8a350394 N°7761 - Dehardcode input set SCSS variables and set it in Darkmoon 2026-09-02 10:13:51 +02:00
odain
4ae3a8ec1d N°8413 - Make data synchro work on DBObject - fix replica view in case of DBObject sync - display obj details 2026-09-02 09:48:01 +02:00
odain
34c394718d N°8413 - Make data synchro work on DBObject - fix replica view in case of DBObject sync 2026-09-02 09:40:19 +02:00
Timmy38
1fac630fdb N°10005 Fix phpunit testcases labels 2026-09-02 09:33:40 +02:00
lenaick.moreira
cab1710498 N°9981 - Add remote_env parameter to use data/production-build-modules instead of data/production-modules during MTP 2026-09-01 17:07:25 +02:00
odain
8d1711bef5 N°9875 - fix export from twig controller 2026-09-01 15:01:52 +02:00
odain
f35af2b8b0 Merge branch 'issue/7796-ticket-without-cmdb' into develop 2026-09-01 14:47:31 +02:00
odain
91e997a4e0 N°7796 - itop-ticket and itop-bridge-cmdb-ticket not coherents 2026-09-01 14:42:12 +02:00
Eric Espie
a8eb2a3fff N°10019 - APC cache not erased after MTP (online and offline), unattended install 2026-09-01 14:04:33 +02:00
Stephen Abello
dc5384f8aa Re-compile setup.css 2026-09-01 08:42:26 +02:00
Stephen Abello
2540d7039d Fix code style 2026-08-31 16:43:56 +02:00
Stephen Abello
373942f922 N°9152 - Add extensibility API endpoints for UI elements (#1017)
---------

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
Co-authored-by: Benjamin DALSASS <benjamin.dalsass@combodo.com>
2026-08-31 16:03:36 +02:00
Timmy38
7d4fc98ecc N°10005 Force check installed extensions 2026-08-31 14:47:14 +02:00
Timmy38
cfb04561ec N°9998 fix remote uninstallable flag 2026-08-31 14:40:36 +02:00
Lenaick
f3bad3538c N°9134 - Detect extension with no code when installing by data feature removal extension (#1022) 2026-08-31 10:01:05 +02:00
Lenaick
9c6baaeef4 N°9984 - Exclude auto-select modules from selection check in unattended-install when not specified in choices (#1032) 2026-08-28 10:38:02 +02:00
Lenaick
e769e53653 N°9984 - Error while compiling iTop 3.3 with PMP Extended (#1029)
* N°9984 - Error while compiling iTop 3.3 with PMP Extended

* N°9984 - Error while compiling iTop 3.3 with PMP Extended
2026-08-28 10:01:44 +02:00
Timmy38
42380f7a7a N°3789 Fix missing import 2026-08-27 11:46:03 +02:00
Vincent Dumas
8b384498e3 Fix FR typo 2026-08-27 09:43:24 +02:00
Timmy38
04f1eaff1f N°9989 Do not show "check compatibility" button at all when it should not be available 2026-08-27 09:33:37 +02:00
Molkobain
175b88de30 N°9144 - Fix typo in English sentence 2026-08-26 19:24:25 +02:00
Vaibhav Srivastava
0a5b0b403e docs: fix typo 2026-08-26 15:22:39 +02:00
odain-cbd
a346b71e9a N°9979 - Hide "keep current choice" setup button in case of a package upgrade (#1026)
* N°9979 - phstan cleanup

* N°9979 - Hide keep current choice setup button in case of a package upgrade

* N°9979 - optimize SQL queries
2026-08-26 14:09:05 +02:00
Timmy38
8065343ea6 N°9974 Show extension code in metadata for extensions (#1025) 2026-08-26 10:37:15 +02:00
Eric Espie
9c6087fd54 N°9982 - Install history is broken for MTP 2026-08-25 17:53:29 +02:00
Eric Espie
66073ba390 N°9982 - Install history is broken for MTP 2026-08-25 17:50:58 +02:00
jf-cbd
4756e2474c Merge remote-tracking branch 'origin/support/3.2' into develop 2026-08-25 17:05:57 +02:00
jf-cbd
7dbbf742c4 Fix code syntax (that was only 8.4+) 2026-08-25 17:05:30 +02:00
jf-cbd
2cd4fd1e0e Merge remote-tracking branch 'origin/support/3.2' into develop 2026-08-25 16:09:31 +02:00
jf-cbd
fffff76c82 N°9975 - PHPmailer: Sending email with same headers as before (#1023) 2026-08-25 16:08:51 +02:00
jf-cbd
06d593631d Merge remote-tracking branch 'origin/support/3.2' into develop 2026-08-25 09:13:59 +02:00
Benjamin DALSASS
54a0dfd06f Merge branch 'support/3.2' into develop
# Conflicts:
#	application/transaction.class.inc.php
#	dictionaries/en.dictionary.itop.ui.php
#	dictionaries/fr.dictionary.itop.ui.php
#	dictionaries/pt_br.dictionary.itop.ui.php
#	dictionaries/ru.dictionary.itop.ui.php
#	dictionaries/zh_cn.dictionary.itop.ui.php
2026-08-25 07:16:55 +02:00
odain
e31492fe27 N°9949 - code style 2026-08-24 19:49:01 +02:00
odain-cbd
dfd7f4cd0a N°9949 - Cannot uninstall IPAM from setup wizard screen - extension management fix (#1024)
* N°9949 - Cannot uninstall IPAM from setup wizard screen - fix extension mgt as well

* N°9949 - remove dupicated line

* N°9949 - fix log level

* N°9949 - log enhancement in ext mgt

* N°9949 - phpstan code cleanup
2026-08-24 19:35:06 +02:00
jf-cbd
69624116db N°9919 - Check if "To" exists when sendind mail with PHPMail (#1021) 2026-08-24 17:42:05 +02:00
Molkobain
f3b69ad12e N°7299 - Migrate remaining usages of deprecated JS libs (#1001) 2026-08-24 13:01:26 +02:00
v-dumas
edb33e31da N°9643 - Move REST and KAFKA sample as Protocol 2026-08-24 09:14:02 +02:00
Molkobain
5542d9882f N°9956 - Fix duplicated translations 2026-08-24 08:40:24 +02:00
Molkobain
629f9ec210 N°9956 - Fix CI due to wrong dictionary entries formatting 2026-08-23 10:00:25 +02:00
Lars Kaltefleiter
4bd5c22d36 N°9973 - Update british english translations (#1008)
Some `en_gb` entries still carried the US spelling, so British users were served
the American form. This pull request:

- corrects 49 entries that used a US spelling (organization, synchronize,
  synchronized, resynchronization, catalog, categorize, customize, customizable,
  containerization, virtualization, personalized, localized, serialized,
  sanitize, and their capitalised forms)
- drops the `~~` marker from 175 entries whose text already is correct British
  English
- adds 1 `en_gb` dictionary for a module that shipped none

Code identifiers keep their US spelling on purpose, for example the PHP setting
`post_max_size`.

Dictionary keys and the EN US entries are untouched. Where an `en_gb` entry is
absent, `Dict` already falls back to EN US, so nothing is duplicated for the
sake of it.
2026-08-22 09:45:34 +02:00
Lars Kaltefleiter
2c53b740fc N°9956 - Update german translations (#1007)
* 🌐 Complete the German (de) translations (iTop 3.3)

German was incomplete in ways that the `~~` marker alone does not reveal.
This pull request:

- translates 317 entries that still carried the `~~` fallback marker
- fills 265 descriptions that were empty while the English entry had text
- adds 69 keys that existed only in the English dictionary
- updates 57 entries that still mirrored an older, much shorter English wording
- restores 8 broken printf placeholders
- adds 3 German dictionaries for modules that shipped none

English source strings and dictionary keys are untouched; only German values
change. Each printf placeholder was checked against its English entry.

* 🌐 Translate the new welcome popup entries (iTop 3.3)

Follow-up to the develop merge: translates the new `330_05_Portal` title and
description, extends `330_01_Welcome` with the sentences added upstream, and
restores the German wording that the merge had reverted to English for
`330_01_Welcome:Title`, `330_02_AIFoundations:Title` and
`330_04_MFA:Description`.

---------

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2026-08-22 09:21:39 +02:00
odain-cbd
18b7ee4d30 N°9965 - Extensions management and Designer don't have the same view on extension (#1020)
* N°9965 - GetChoicesFromDatabase no more static to mock it

* N°9965 - remove empty line
2026-08-21 15:58:38 +02:00
Eric Espié
98913a2a86 N°9950 - Error loading structural data on upgrade (#1019)
* N°9950 - Error loading structural data on upgrade

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* N°9950 - Error loading structural data on upgrade

* N°9950 - Error loading structural data on upgrade

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-08-21 15:23:44 +02:00
v-dumas
62ea1c1fd6 N°9763 - Fix error in Model sample data (2) 2026-08-21 14:55:51 +02:00
v-dumas
b919adf4d8 N°9763 - Fix error in Model sample data 2026-08-21 11:57:01 +02:00
v-dumas
4ebd03eebb Ensure extensions menus in Service Management end up after Catalog 2026-08-20 17:43:55 +02:00
odain-cbd
4f891a9170 N°9935 - Disable data compatibility check when env-production empty (#1004)
* N°9935 - Disable data compatibility check when env-production empty

* N°9935 - redundant test cleanup
2026-08-20 15:27:50 +02:00
odain
7583ede3b3 N°9949 - code style 2026-08-20 11:59:56 +02:00
odain-cbd
95cb21cff7 N°9949 - Cannot uninstall IPAM from setup wizard screen (#1015)
* N°9949 - Cannot uninstall IPAM from setup wizard screen

* N°9949 - add test coverage

* N°9949 - handle list in compilation
2026-08-20 10:03:25 +02:00
Molkobain
cdd7bbedcb N°9625 - Update welcome popup introduction message and add message for new portal look 2026-08-20 09:39:51 +02:00
Molkobain
ea1ed03d0c N°9948 - Fix core dashlets after AttributeDefinition split (#1014) 2026-08-20 08:53:09 +02:00
Lenaick
2073e8c10c N°9861 - Check user can go to audit step only when keep current choice button has been clicked (#1013)
* N°9861 - Check user can go to audit step only when keep current choice button has been clicked

* Rename variable to improve clarity
2026-08-19 16:03:25 +02:00
odain
1a41349d7b N°8806 - fix setup tests 2026-08-19 15:54:39 +02:00
odain
fdc1ef40e6 N°9875 - error msg typo 2026-08-19 15:27:49 +02:00
odain-cbd
4722551a16 N°9875 - Error deprecated on component version object (#1010)
* N°9875 - Error deprecated on component version object - propose boilerplate methods to handle ZipArchive

* N°9875 - Error deprecated on component version object - use ZipArchive boilerplate methods

* N°9875 - code style

* N°9875 - review feedbacks

* N°9875 - simplify return type of ZipArchiveCreateWithTempNam

* N°9875 - add @since
2026-08-19 15:14:32 +02:00
odain
a2934ef05b N°8806 - Installation multiple extension with dependence via ITSM Designer - fix check compatibity when new dictionaries not present yet in iTop core like SV-SV 2026-08-19 15:13:30 +02:00
Benjamin Dalsass
97364af71d Feature/8420 transaction id lifetime (#1009) 2026-08-19 08:45:49 +02:00
1102 changed files with 38187 additions and 57263 deletions

View File

@@ -110,11 +110,11 @@ gitGraph
commit id: "2025-09-25" tag: "2.7.13"
checkout support/3.2
commit id: "2026-04-27 " tag: "3.2.3"
checkout support/3.2.3
commit id: "2026-05-25 " tag: "3.2.3-1"
commit id: "2026-07-17 " tag: "3.2.3-2"
checkout develop
commit id: "2026-07-23" tag: "3.3.0-beta1"
commit id: "2026-09-15" tag: "3.3.0"
```
To learn more, check the [iTop community versions history on the official wiki](https://www.itophub.io/wiki/page?id=latest:release:start).

View File

@@ -8,6 +8,8 @@ body:
Please explain why you're creating this issue :
- Please describe what's your improvement proposition.
- Then tell us if you're willing to create a PR for this enhancement ? If so, we'll indicate in the issue if we're interested in it.
- The more users are affected and the greater is the impact, the more likely this improvement will be accepted. If you identified a bug and have an improvement proposition, please use the 'Bug report' template instead."
Please note we're not willing to accept code improvement (e.g. refactoring) that won't have a "functional" change for the user.
- type: textarea
id: enhancement_details

View File

@@ -1,18 +1,22 @@
<!--
IMPORTANT: Before creating your PR, please create an issue first to know if Combodo is interested in your contribution (not needed for translations PR).
Since we may refuse a PR, it's preferable to create an issue first, to avoid spending time coding something that won't be accepted.
PR that will benefit the most users and has a greater impact on the product are more likely to be accepted, so please explain your use case and why you think it would be useful for the community.
We're not willing to receive PR concerning codes improvements (e.g. code refactoring), except if it's part of a code that brings/corrects a feature for users.
Please note that we're working with sprints, so we reserve the right to decline a PR if we do not plan to work on that subject in the 6 coming months.
Thank you for your comprehension 😊
Once you've done it, and we confirmed we're interested in it, please follow the guidelines within this PR template before submitting it, it will greatly help us process your PR. 🙏
Once you've created the issue, and we confirmed we're interested in it, 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 thread / Another PR / A GitHub Issue / Combodo ticket? | <!-- Put the URL --> |
| Type of change? | Bug fix / Enhancement / Translations |
| Question | Answer |
|---------------------------------------------------------------------------------|---------------------------------------|
| Related to a SourceForge thread / Another PR / A GitHub Issue / Combodo ticket? | <!-- Put the URL or ticket number --> |
| Type of change? | Bug fix / Enhancement / Translations |
## Symptom (bug) / Objective (enhancement)
@@ -70,6 +74,7 @@ Explain in details how you are proposing to solve this:
Don't remove these lines, check them once done.
-->
- [ ] If my PR is a bug fix or an enhancement, I opened an issue that got reviewed and approved by Combodo
- [ ] 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

View File

@@ -1,56 +0,0 @@
name: Add PRs to Combodo PRs Dashboard
on:
pull_request:
types:
- opened
issues:
types:
- opened
workflow_call:
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 of the organization
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/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/labels \
-d '{"labels":["internal"]}'
- name: Set PR author as assignee if member of the organization
if: env.is_member == 'true' && github.event_name == 'pull_request'
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}" \
https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/assignees \
-d '{"assignees":["${{ github.event.pull_request.user.login }}"]}'
env:
is_member: ${{ env.is_member }}
- name: Add PR to the appropriate project
uses: actions/add-to-project@v2
with:
project-url: ${{ env.project_url }}
github-token: ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}

13
.github/workflows/add-to-dashboard.yml vendored Normal file
View File

@@ -0,0 +1,13 @@
name: Add issue/PR to Combodo dashboard
on:
pull_request:
types: [opened]
issues:
types: [opened]
jobs:
route-to-project:
uses: Combodo/.github/.github/workflows/action.yml@master
secrets:
PR_AUTOMATICALLY_ADD_TO_PROJECT: ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}

View File

@@ -61,7 +61,7 @@ foreach ($aTcpdfFontsDirContent as $sTcpdfFontResourceName) {
* 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.*');
$aFontFilesToCopy = glob(__DIR__.DIRECTORY_SEPARATOR.'droidsansfallback.*');
foreach ($aFontFilesToCopy as $sFontFileToCopy) {
$sFontFileName = basename($sFontFileToCopy);
echo $sCurrentScriptFileName.': copying '.$sFontFileName."\n";

View File

@@ -33,13 +33,13 @@ iTop also offers mass import tools to help you become even more efficient.
[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
[65]: https://github.com/Combodo/iTop/releases/latest
## Resources
- [iTop Forums][1]: community support
- [iTop Tickets][2]: for feature requests and bug reports
- [GitHub Discussions][1]: community support
- [GitHub Issues Tickets ][2]: for feature requests and bug reports
- [Releases download][3]
- [iTop requirements][4]
- [Documentation][5] covering both iTop and its official extensions
@@ -47,9 +47,9 @@ iTop also offers mass import tools to help you become even more efficient.
- [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/
[1]: https://github.com/Combodo/iTop/discussions
[2]: https://github.com/Combodo/iTop/issues
[3]: https://github.com/Combodo/iTop/releases
[4]: https://www.itophub.io/wiki/page?id=latest:install:requirements
[5]: https://www.itophub.io/wiki
[6]: https://store.itophub.io/en_US/
@@ -95,7 +95,7 @@ We would like to give a special thank you 🤗 to the people from the community
- Casteleyn, Thomas (a.k.a [@Hipska](https://www.github.com/Hipska))
- Castro, Randall Badilla
- Colantoni, Maria Laura
- Couronné, Guy
- Couronné, Guy [@GurneyHallack](https://github.com/GurneyHallack)
- Dejin, Bie (a.k.a [@bdejin](https://github.com/bdejin))
- Delicado, Elodie
- Dvořák, Lukáš
@@ -110,7 +110,7 @@ We would like to give a special thank you 🤗 to the people from the community
- Khamit, Shamil
- Kincel, Martin
- Konečný, Kamil
- Kunin, Vladimir
- Kunin, Vladimir (a.k.a [@vbkunin](https://github.com/vbkunin)
- Lassiter, Denis (a.k.a [@delassiter](https://github.com/delassiter))
- Lazcano, Federico
- Lucas, Jonathan
@@ -128,6 +128,7 @@ We would like to give a special thank you 🤗 to the people from the community
- Šafránek, Jaroslav (a.k.a [jkcinik](https://sourceforge.net/u/jkcinik/profile/) on SourceForge)
- Seki, Shoji
- Shilov, Vladimir
- Srivastava, Vaibhav (a.k.a [@vaibhav8a](https://github.com/vaibhav8a))
- 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))

View File

@@ -30,6 +30,15 @@ require_once(APPROOT.'application/newsroomprovider.class.inc.php');
* @license http://opensource.org/licenses/AGPL-3.0
* @since 2.7.0
*/
require_once(APPROOT.'application/applicationextension/common/ApplicationPopupMenuItem.php');
require_once(APPROOT.'application/applicationextension/common/iPopupMenuExtension.php');
require_once(APPROOT.'application/applicationextension/common/JSButtonItem.php');
require_once(APPROOT.'application/applicationextension/common/JSPopupMenuItem.php');
require_once(APPROOT.'application/applicationextension/common/SeparatorPopupMenuItem.php');
require_once(APPROOT.'application/applicationextension/common/URLButtonItem.php');
require_once(APPROOT.'application/applicationextension/common/URLPopupMenuItem.php');
require_once(APPROOT.'application/applicationextension/backoffice/iApplicationUIExtension.php');
require_once(APPROOT.'application/applicationextension/backoffice/iBackofficeDictEntriesExtension.php');
require_once(APPROOT.'application/applicationextension/backoffice/iBackofficeDictEntriesPrefixesExtension.php');
@@ -43,19 +52,12 @@ require_once(APPROOT.'application/applicationextension/backoffice/iBackofficeScr
require_once(APPROOT.'application/applicationextension/backoffice/iBackofficeStyleExtension.php');
require_once(APPROOT.'application/applicationextension/backoffice/iFieldRendererMappingsExtension.php');
require_once(APPROOT.'application/applicationextension/backoffice/iPageUIBlockExtension.php');
require_once(APPROOT.'application/applicationextension/backoffice/iPopupMenuExtension.php');
require_once(APPROOT.'application/applicationextension/backoffice/iPreferencesExtension.php');
require_once(APPROOT.'application/applicationextension/backoffice/iWelcomePopupExtension.php');
require_once(APPROOT.'application/applicationextension/backoffice/AbstractApplicationUIExtension.php');
require_once(APPROOT.'application/applicationextension/backoffice/AbstractPageUIBlockExtension.php');
require_once(APPROOT.'application/applicationextension/backoffice/AbstractPreferencesExtension.php');
require_once(APPROOT.'application/applicationextension/backoffice/AbstractWelcomePopupExtension.php');
require_once(APPROOT.'application/applicationextension/backoffice/ApplicationPopupMenuItem.php');
require_once(APPROOT.'application/applicationextension/backoffice/JSButtonItem.php');
require_once(APPROOT.'application/applicationextension/backoffice/JSPopupMenuItem.php');
require_once(APPROOT.'application/applicationextension/backoffice/SeparatorPopupMenuItem.php');
require_once(APPROOT.'application/applicationextension/backoffice/URLButtonItem.php');
require_once(APPROOT.'application/applicationextension/backoffice/URLPopupMenuItem.php');
require_once(APPROOT.'application/applicationextension/iBackupExtraFilesExtension.php');
require_once(APPROOT.'application/applicationextension/iKPILoggerExtension.php');

View File

@@ -1,5 +1,9 @@
<?php
use Combodo\iTop\Application\UI\Base\Common\Metadata\AriaAttributes;
use Combodo\iTop\Application\UI\Base\Common\Metadata\DataAttributes;
use Combodo\iTop\Application\UI\Base\Common\Metadata\Grouping;
/**
* Base class for the various types of custom menus
*
@@ -7,7 +11,7 @@
* @package UIExtensibilityAPI
* @since 2.0
*/
abstract class ApplicationPopupMenuItem
abstract class ApplicationPopupMenuItem implements iGroupingProvider, iDataAttributesProvider, iAriaAttributesProvider
{
/** @ignore */
protected $sUID;
@@ -19,6 +23,12 @@ abstract class ApplicationPopupMenuItem
protected $sIconClass;
/** @ignore */
protected $aCssClasses;
/** @since 3.3.0 */
protected ?AriaAttributes $oAriaAttributes = null;
/** @since 3.3.0 */
protected ?DataAttributes $oDataAttributes = null;
/** @since 3.3.0 */
protected ?Grouping $oGrouping = null;
/**
* Constructor
@@ -58,6 +68,17 @@ abstract class ApplicationPopupMenuItem
return $this->sLabel;
}
/**
* @param string $sLabel
*
* @api
* @since 3.3.0
*/
public function SetLabel(string $sLabel): void
{
$this->sLabel = $sLabel;
}
/**
* Get the CSS classes
*
@@ -141,9 +162,76 @@ abstract class ApplicationPopupMenuItem
*/
abstract public function GetMenuItem();
/**
* Get additional data, child classes can use this without having to worry about this class interfaces
* @return array<string, mixed>
* @since 3.3.0
*/
protected function GetMenuItemAdditionalData(): array
{
$aAdditionalData = [];
$aDataAttributes = $this->GetDataAttributes()->GetAttributes();
if (!empty($aDataAttributes)) {
$aAdditionalData['data_attributes'] = $aDataAttributes;
}
$aAriaAttributes = $this->GetAriaAttributes()->GetAttributes();
if (!empty($aAriaAttributes)) {
$aAdditionalData['aria_attributes'] = $aAriaAttributes;
}
$oGrouping = $this->GetGrouping();
if ($oGrouping !== null) {
$aAdditionalData['grouping_uid'] = $oGrouping->GetUID();
}
return $aAdditionalData;
}
/** @ignore */
public function GetLinkedScripts()
{
return [];
}
/**
* @api
* @since 3.3.0
*/
public function GetAriaAttributes(): AriaAttributes
{
return $this->oAriaAttributes ??= new AriaAttributes();
}
/**
* @api
* @since 3.3.0
*/
public function GetDataAttributes(): DataAttributes
{
return $this->oDataAttributes ??= new DataAttributes();
}
/**
* @api
* @since 3.3.0
*/
public function GetGrouping(): ?Grouping
{
return $this->oGrouping;
}
/**
* @param Grouping|null $oGrouping
* @return static
* @api
* @since 3.3.0
*/
public function SetGrouping(?Grouping $oGrouping): static
{
$this->oGrouping = $oGrouping;
return $this;
}
}

View File

@@ -3,7 +3,7 @@
/**
* 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
* Note: This works only in the backoffice, {@see \common\JSButtonItem} for the end-user portal
*
* @api
* @package UIExtensibilityAPI
@@ -40,7 +40,7 @@ class JSPopupMenuItem extends ApplicationPopupMenuItem
public function GetMenuItem()
{
// Note: the semicolumn is a must here!
return [
$aData = [
'label' => $this->GetLabel(),
'onclick' => $this->GetJsCode().'; return false;',
'url' => $this->GetUrl(),
@@ -48,6 +48,8 @@ class JSPopupMenuItem extends ApplicationPopupMenuItem
'icon_class' => $this->sIconClass,
'tooltip' => $this->sTooltip,
];
return array_merge($aData, $this->GetMenuItemAdditionalData());
}
/** @ignore */

View File

@@ -24,6 +24,12 @@ class SeparatorPopupMenuItem extends ApplicationPopupMenuItem
/** @ignore */
public function GetMenuItem()
{
return ['label' => '<hr class="menu-separator">', 'url' => '', 'css_classes' => $this->aCssClasses];
$aData = [
'label' => '<hr class="menu-separator">',
'url' => '',
'css_classes' => $this->aCssClasses,
];
return array_merge($aData, $this->GetMenuItemAdditionalData());
}
}

View File

@@ -3,7 +3,7 @@
/**
* 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
* Note: This works only in the backoffice, {@see \common\URLButtonItem} for the end-user portal
*
* @api
* @package UIExtensibilityAPI
@@ -35,13 +35,15 @@ class URLPopupMenuItem extends ApplicationPopupMenuItem
/** @ignore */
public function GetMenuItem()
{
return ['label' => $this->GetLabel(),
$aData = ['label' => $this->GetLabel(),
'url' => $this->GetUrl(),
'target' => $this->GetTarget(),
'css_classes' => $this->aCssClasses,
'icon_class' => $this->sIconClass,
'tooltip' => $this->sTooltip,
];
return array_merge($aData, $this->GetMenuItemAdditionalData());
}
/** @ignore */

View File

@@ -0,0 +1,15 @@
<?php
use Combodo\iTop\Application\UI\Base\Common\Metadata\AriaAttributes;
/**
* Allows to provide ARIA attributes to classes that implement this interface.
* The ARIA attributes will be used to improve accessibility of the UI components
*
* @api
* @since 3.3.0
*/
interface iAriaAttributesProvider
{
public function GetAriaAttributes(): AriaAttributes;
}

View File

@@ -0,0 +1,14 @@
<?php
use Combodo\iTop\Application\UI\Base\Common\Metadata\DataAttributes;
/**
* Allows to provide data attributes to classes that implement this interface.
* The data attributes will be used to provide additional information to the UI components
* @api
* @since 3.3.0
*/
interface iDataAttributesProvider
{
public function GetDataAttributes(): DataAttributes;
}

View File

@@ -0,0 +1,13 @@
<?php
use Combodo\iTop\Application\UI\Base\Common\Metadata\Grouping;
/**
* Allows to provide grouping information to classes that implement this interface.
* @api
* @since 3.3.0
*/
interface iGroupingProvider
{
public function GetGrouping(): ?Grouping;
}

View File

@@ -0,0 +1,14 @@
<?php
/**
* Implemented by metadata value objects that flatten to HTML attributes.
* Ease the implementation of classes that need to provide HTML attributes to the UI components
*
* @api
* @since 3.3.0
*/
interface iHtmlAttributesSource
{
/** @return array<string, string> Attribute name => value, ready to be escaped and printed */
public function GetHtmlAttributes(): array;
}

View File

@@ -95,7 +95,24 @@ interface iPopupMenuExtension
* @todo
*/
public const PORTAL_MENU_ACTIONS = 10;
/**
* Get the list of items to be added to the backoffice top-bar items
* $param is an array: [] for now, in a distant future we want to give a complete context
* @since 3.3.0
*/
public const MENU_TOPBAR_ACTIONS = 11;
/**
* Get the list of items to be added to the actions on a given form field (i.e. the attribute of an object)
* $param is an array: ['object' => DBObject, att_code => attribute code , mode => edit/read]
* @since 3.3.0
*/
public const MENU_OBJDETAILS_FIELD_ACTIONS = 12;
/**
* Get the list of items to be added to the actions in the activity panel (read-only mode)
* $param is an array: ['object' => DBObject, caselog_att_code => caselog attribute code or 'activity']
* @since 3.3.0
*/
public const MENU_OBJDETAILS_ACTIVITY_PANEL_ACTIONS = 13;
/**
* Get the list of items to be added to a menu.
*

View File

@@ -49,6 +49,7 @@ use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Renderer\BlockRenderer;
use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer;
use Combodo\iTop\Renderer\Console\ConsoleFormRenderer;
use Combodo\iTop\Service\InterfaceDiscovery\InterfaceDiscovery;
use Combodo\iTop\Service\Links\LinkSetDataTransformer;
use Combodo\iTop\Service\Links\LinkSetModel;
use Combodo\iTop\Service\TemporaryObjects\TemporaryObjectHelper;
@@ -1065,6 +1066,14 @@ HTML
}
}
$val['value_raw'] = ($bExcludeRawValue === false) ? $this->Get($sAttCode) : '';
$val['actions'] = [];
/** @var \iPopupMenuExtension $oExtensionInstance */
foreach (InterfaceDiscovery::GetInstance()->FindItopClasses('iPopupMenuExtension') as $oExtensionInstance) {
foreach ($oExtensionInstance::EnumItems(iPopupMenuExtension::MENU_OBJDETAILS_FIELD_ACTIONS, ['object' => $this, 'att_code' => $sAttCode, 'mode' => $bEditMode ? 'edit' : 'read']) as $oMenuItem) {
$val['actions'][] = $oMenuItem;
}
}
// The field is visible, add it to the current column
$oField = FieldUIBlockFactory::MakeFromParams($val);
@@ -4651,7 +4660,7 @@ EOF
// Not in preview mode, do the update for real
$sTransactionId = utils::ReadPostedParam('transaction_id', '', 'transaction_id');
if (!utils::IsTransactionValid($sTransactionId, false)) {
throw new Exception(Dict::S('UI:Error:ObjectAlreadyUpdated'));
throw new Exception(Dict::S('UI:Error:InvalidToken'));
}
utils::RemoveTransaction($sTransactionId);
}

View File

@@ -586,7 +586,7 @@ JS
/** @var \Dashlet $oDashlet */
foreach ($aCell as $oDashlet) {
if ($oDashlet->IsVisible()) {
$oPage->add('<div class="dashlet_properties" id="dashlet_properties_'.$oDashlet->GetID().'" style="display:none">');
$oPage->add('<div class="dashlet_properties" id="dashlet_properties_'.$oDashlet->GetID().'" data-role="ibo-dashlet-properties" data-dashlet-class="'.$oDashlet->GetDashletType().'" style="display:none">');
$oForm = $oDashlet->GetForm();
$this->SetFormParams($oForm, $aExtraParams);
$oForm->RenderAsPropertySheet($oPage, false, '.itop-dashboard');
@@ -1203,7 +1203,7 @@ EOF
}
$aRenderParams['dashboard_div_id'] = $aExtraParams['dashboard_div_id'];
$sJSExtraParams = json_encode($aExtraParams);
$oPage->add('<div id="dashboard_editor" class="ibo-dashboard-editor" data-role="ibo-dashboard-editor">');
$oPage->add('<div id="dashboard_editor" class="ibo-dashboard-editor" data-role="ibo-dashboard-editor" data-dashboard-id="'.$this->sId.'">');
$oPage->add('<div class="ui-layout-center">');
$this->SetCustomFlag(true);
$this->Render($oPage, true, $aRenderParams);

View File

@@ -25,6 +25,20 @@ use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
use Combodo\iTop\Application\UI\Base\iUIBlock;
use Combodo\iTop\Application\UI\Base\UIBlock;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Core\AttributeDefinition\AttributeDateTime;
use Combodo\iTop\Core\AttributeDefinition\AttributeDecimal;
use Combodo\iTop\Core\AttributeDefinition\AttributeDuration;
use Combodo\iTop\Core\AttributeDefinition\AttributeEncryptedString;
use Combodo\iTop\Core\AttributeDefinition\AttributeEnum;
use Combodo\iTop\Core\AttributeDefinition\AttributeExternalField;
use Combodo\iTop\Core\AttributeDefinition\AttributeFriendlyName;
use Combodo\iTop\Core\AttributeDefinition\AttributeInteger;
use Combodo\iTop\Core\AttributeDefinition\AttributeLinkedSet;
use Combodo\iTop\Core\AttributeDefinition\AttributeOneWayPassword;
use Combodo\iTop\Core\AttributeDefinition\AttributePassword;
use Combodo\iTop\Core\AttributeDefinition\AttributePercentage;
use Combodo\iTop\Core\AttributeDefinition\AttributeSubItem;
use Combodo\iTop\Core\AttributeDefinition\iAttributeNoGroupBy;
require_once(APPROOT.'application/forms.class.inc.php');
@@ -440,7 +454,7 @@ EOF
// For external fields, find the real type of the target
$sExtFieldAttCode = $sAttCode;
$sTargetClass = $sClass;
while (is_a($sAttType, 'AttributeExternalField', true)) {
while (is_a($sAttType, AttributeExternalField::class, true)) {
$sExtKeyAttCode = $this->oModelReflection->GetAttributeProperty($sTargetClass, $sExtFieldAttCode, 'extkey_attcode');
$sTargetAttCode = $this->oModelReflection->GetAttributeProperty($sTargetClass, $sExtFieldAttCode, 'target_attcode');
$sTargetClass = $this->oModelReflection->GetAttributeProperty($sTargetClass, $sExtKeyAttCode, 'targetclass');
@@ -450,13 +464,13 @@ EOF
}
$aForbidenAttType = [
'AttributeLinkedSet',
'AttributeFriendlyName',
AttributeLinkedSet::class,
AttributeFriendlyName::class,
'iAttributeNoGroupBy', //we cannot only use iAttributeNoGroupBy since this method is also used by the designer who do not have access to the classes' PHP reflection API. So the known classes has to be listed altogether
'AttributeOneWayPassword',
'AttributeEncryptedString',
'AttributePassword',
iAttributeNoGroupBy::class, //we cannot only use iAttributeNoGroupBy since this method is also used by the designer who do not have access to the classes' PHP reflection API. So the known classes has to be listed altogether
AttributeOneWayPassword::class,
AttributeEncryptedString::class,
AttributePassword::class,
];
foreach ($aForbidenAttType as $sForbidenAttType) {
if (is_a($sAttType, $sForbidenAttType, true)) {
@@ -468,7 +482,7 @@ EOF
if (!in_array($sLabel, $aGroupBy)) {
$aGroupBy[$sAttCode] = $sLabel;
if (is_a($sAttType, 'AttributeDateTime', true)) {
if (is_a($sAttType, AttributeDateTime::class, true)) {
$aGroupBy[$sAttCode.':hour'] = Dict::Format('UI:DashletGroupBy:Prop-GroupBy:Select-Hour', $sLabel);
$aGroupBy[$sAttCode.':month'] = Dict::Format('UI:DashletGroupBy:Prop-GroupBy:Select-Month', $sLabel);
$aGroupBy[$sAttCode.':day_of_week'] = Dict::Format('UI:DashletGroupBy:Prop-GroupBy:Select-DayOfWeek', $sLabel);
@@ -1102,7 +1116,7 @@ abstract class DashletGroupBy extends Dashlet
$aAttributeTypes = $this->oModelReflection->ListAttributes($this->sClass);
if (isset($aAttributeTypes[$this->sGroupByAttCode])) {
$sAttributeType = $aAttributeTypes[$this->sGroupByAttCode];
if (is_subclass_of($sAttributeType, 'AttributeDateTime') || $sAttributeType == 'AttributeDateTime') {
if (is_subclass_of($sAttributeType, AttributeDateTime::class) || $sAttributeType == AttributeDateTime::class) {
$this->sOrderDirection = 'asc';
} else {
$this->sOrderDirection = 'desc';
@@ -1258,7 +1272,7 @@ abstract class DashletGroupBy extends Dashlet
if ($this->oModelReflection->IsValidAttCode($sClass, $this->sGroupByAttCode)) {
$aAttributeTypes = $this->oModelReflection->ListAttributes($sClass);
$sAttributeType = $aAttributeTypes[$this->sGroupByAttCode];
if (is_subclass_of($sAttributeType, 'AttributeDateTime') || $sAttributeType == 'AttributeDateTime') {
if (is_subclass_of($sAttributeType, AttributeDateTime::class) || $sAttributeType == AttributeDateTime::class) {
// Note: an alternative to this somewhat hardcoded way of doing things would be to implement...
//$oExpr = Expression::FromOQL($this->sGroupByExpr);
//$aTranslationData = array($oQuery->GetClassAlias() => array($this->sGroupByAttCode => new ScalarExpression(date('Y-m-d H:i:s', $iTime))));
@@ -1289,7 +1303,7 @@ abstract class DashletGroupBy extends Dashlet
foreach ($aValues as $sValue) {
$aDisplayValues[] = ['label' => $sValue, 'value' => (int)rand(1, 15)];
}
} elseif (is_subclass_of($sAttributeType, 'AttributeEnum') || $sAttributeType == 'AttributeEnum') {
} elseif (is_subclass_of($sAttributeType, AttributeEnum::class) || $sAttributeType == AttributeEnum::class) {
$aAllowed = $this->oModelReflection->GetAllowedValues_att($sClass, $this->sGroupByAttCode);
if ($aAllowed) { // null for non enums
foreach ($aAllowed as $sValue => $sValueLabel) {
@@ -1458,11 +1472,11 @@ abstract class DashletGroupBy extends Dashlet
}
foreach ($this->oModelReflection->ListAttributes($sClass) as $sAttCode => $sAttType) {
switch ($sAttType) {
case 'AttributeDecimal':
case 'AttributeDuration':
case 'AttributeInteger':
case 'AttributePercentage':
case 'AttributeSubItem': // TODO: Known limitation: no unit displayed (values in sec)
case AttributeDecimal::class:
case AttributeDuration::class:
case AttributeInteger::class:
case AttributePercentage::class:
case AttributeSubItem::class: // TODO: Known limitation: no unit displayed (values in sec)
$sLabel = $this->oModelReflection->GetLabel($sClass, $sAttCode);
$aFunctionAttributes[$sAttCode] = $sLabel;
break;

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://www.combodo.com/itop-schema/3.3"
version="3.3">
version="3.4">
<classes>
<class id="AbstractResource" _delta="define">
<parent>cmdbAbstractObject</parent>

View File

@@ -2292,6 +2292,17 @@ class MenuBlock extends DisplayBlock
}
// ResourceId should not be sanitized
$oActionButton->AddDataAttribute('resource-id', $sActionId);
if (isset($aAction['data_attributes']) && is_array($aAction['data_attributes'])) {
foreach ($aAction['data_attributes'] as $sName => $sValue) {
$sDataAttributeName = $sName;
$oActionButton->AddDataAttribute($sDataAttributeName, (string) $sValue);
}
}
if (isset($aAction['aria_attributes']) && is_array($aAction['aria_attributes'])) {
foreach ($aAction['aria_attributes'] as $sName => $sValue) {
$oActionButton->AddAriaAttribute((string) $sName, (string) $sValue);
}
}
$oActionButton->AddCSSClasses(['ibo-action-button', 'ibo-regular-action-button']);
if (empty($sLabel)) {
if (empty($aAction['tooltip'])) {

View File

@@ -220,10 +220,19 @@ class DesignerForm
$sValidationFields = '</td><td class="prop_icon prop_apply ibo-prop--apply" >'.$sValidation.'</td><td class="prop_icon prop_cancel ibo-prop--cancel"><span><div class="ibo-button ibo-is-alternative ibo-is-neutral" data-tooltip-content="'.Dict::Format('UI:DashboardEdit:Revert').'"><i class="fas fa-undo"></i></div></span></td>'
.$this->EndRow();
$aPropertyFieldData = [
'code' => $oField->GetCode(),
'type' => $oField->GetInputType(),
'label' => $aRow['label'],
'raw-value' => $oField->GetRawValue(),
];
if (is_null($aRow['label'])) {
$sReturn .= $this->StartRow($sFieldId).'<td class="prop_value" colspan="2">'.$aRow['value'];
$sReturn .= $this->StartRow($sFieldId, $aPropertyFieldData).
'<td class="prop_value" data-role="ibo-property-field-value" colspan="2">'.$aRow['value'];
} else {
$sReturn .= $this->StartRow($sFieldId).'<td class="prop_label">'.$aRow['label'].'</td><td class="prop_value">'.$aRow['value'];
$sReturn .= $this->StartRow($sFieldId, $aPropertyFieldData).
'<td class="prop_label" data-role="ibo-property-field-label">'.$aRow['label'].
'</td><td class="prop_value" data-role="ibo-property-field-value">'.$aRow['value'];
}
if (!($oField instanceof DesignerFormSelectorField) && !($oField instanceof DesignerMultipleSubFormField)) {
$sReturn .= $sValidationFields;
@@ -294,12 +303,21 @@ EOF
}
}
public function StartRow($sFieldId = null)
public function StartRow($sFieldId = null, $aPropertyFieldData = [])
{
if ($sFieldId != null) {
return '<tr id="row_'.$sFieldId.'" data-path="'.$this->GetHierarchyPath().'" data-selector="'.$this->GetHierarchyParent().'">';
$sPropertyFieldAttributes = '';
foreach ($aPropertyFieldData as $sAttribute => $value) {
if (is_array($value)) {
$value = json_encode($value);
} elseif (is_null($value)) {
$value = '';
}
$sPropertyFieldAttributes .= ' data-property-field-'.$sAttribute.'="'.utils::EscapeHtml((string)$value).'"';
}
return '<tr data-path="'.$this->GetHierarchyPath().'" data-selector="'.$this->GetHierarchyParent().'">';
if ($sFieldId != null) {
return '<tr id="row_'.$sFieldId.'" data-path="'.$this->GetHierarchyPath().'" data-selector="'.$this->GetHierarchyParent().'"'.$sPropertyFieldAttributes.'>';
}
return '<tr data-path="'.$this->GetHierarchyPath().'" data-selector="'.$this->GetHierarchyParent().'"'.$sPropertyFieldAttributes.'>';
}
public function EndRow()
@@ -679,6 +697,14 @@ class DesignerFormField
return $this->sCode;
}
/**
* @return mixed
*/
public function GetRawValue()
{
return $this->defaultValue;
}
/**
* @param \DesignerForm $oForm
*/
@@ -1629,6 +1655,11 @@ class DesignerFormSelectorField extends DesignerFormField
return 'selector_property_field';
}
public function GetRawValue()
{
return $this->defaultRealValue;
}
public function AddSubForm($oSubForm, $sLabel, $sValue)
{
$this->aSubForms[] = ['form' => $oSubForm, 'label' => $sLabel, 'value' => $sValue];

View File

@@ -109,10 +109,18 @@ $('#shortcut_rename_dlg').dialog({
modal: true,
title: '$sDialogTitle',
buttons: [
{ text: "$sOkButtonLabel", click: ShortcutRenameOK},
{ text: "$sCancelButtonLabel", click: function() {
$(this).dialog( "close" ); $(this).remove();
} },
{
text: "$sCancelButtonLabel",
click: function() {
$(this).dialog( "close" ); $(this).remove();
},
'class': 'ibo-button ibo-is-alternative ibo-is-neutral action cancel'
},
{
text: "$sOkButtonLabel",
click: ShortcutRenameOK,
'class': 'ibo-is-regular ibo-is-primary'
},
],
close: function() { $(this).remove(); }
});

View File

@@ -115,7 +115,7 @@ class privUITransactionSession
// Strictly speaking, the two lines below should be grouped together
// by a critical section
// sem_acquire($rSemIdentified);
$id = static::GetUserPrefix().str_replace(['.', ' '], '', microtime());
$id = static::GetUserPrefix().str_replace(['.', ' '], '', microtime()).'-'.bin2hex(random_bytes(24));
Session::Set(['transactions', $id], true);
// sem_release($rSemIdentified);
@@ -236,7 +236,7 @@ class privUITransactionFile
self::CleanupOldTransactions();
$sTransactionIdFullPath = tempnam(utils::GetDataPath().'transactions', static::GetUserPrefix());
$sTransactionIdFullPath = static::CreateUniqueTransactionFilePath(utils::GetDataPath().'transactions', static::GetUserPrefix());
file_put_contents($sTransactionIdFullPath, $iCurrentUserId, LOCK_EX);
$sTransactionIdFileName = basename($sTransactionIdFullPath);
@@ -245,6 +245,33 @@ class privUITransactionFile
return $sTransactionIdFileName;
}
/**
* Create a transaction file path with a longer random suffix and create it atomically.
*
* @param string $sDir
* @param string $sPrefix
*
* @return string
*
* @throws CoreException
*/
private static function CreateUniqueTransactionFilePath(string $sDir, string $sPrefix): string
{
$iMaxAttempts = 10;
for ($i = 0; $i < $iMaxAttempts; $i++) {
$sFileName = $sPrefix.bin2hex(random_bytes(24)); // 48 random hex chars
$sFullPath = $sDir.'/'.$sFileName;
$hFile = @fopen($sFullPath, 'x');
if ($hFile !== false) {
fclose($hFile);
return $sFullPath;
}
}
throw new CoreException('Failed to allocate a unique transaction file name after multiple attempts.');
}
/**
* Check whether a transaction is valid or not and (optionally) remove the valid transaction from
* the session so that another call to IsTransactionValid for the same transaction id
@@ -281,6 +308,18 @@ class privUITransactionFile
return false;
}
$iTime = filemtime($sFilepath);
$iLifetime = (int) MetaModel::GetConfig()->Get('transactions_file_lifetime');
$iLimit = time() - $iLifetime;
if ($iTime < $iLimit) {
self::Info("IsTransactionValid: Transaction '$id' expired.");
if ($iLifetime < 3600) {
IssueLog::Warning("IsTransactionValid: Transaction '$id' expired after only $iLifetime seconds. Consider increasing the 'transactions_file_lifetime' configuration parameter.");
}
@unlink($sFilepath);
return false;
}
if ($bRemoveTransaction) {
$bResult = @unlink($sFilepath);
if (!$bResult) {
@@ -314,7 +353,7 @@ class privUITransactionFile
}
/**
* Cleanup old transactions which have been pending since more than 24 hours
* Cleanup old transactions which have been pending since more than the lifetime defined in the configuration parameter 'transactions_file_lifetime'.
* Use filemtime instead of filectime since filectime may be affected by operations on the directory (like changing the access rights)
*/
protected static function CleanupOldTransactions($sTransactionDir = null)
@@ -327,7 +366,7 @@ class privUITransactionFile
}
clearstatcache();
$iLimit = time() - 24 * 3600;
$iLimit = time() - (int) MetaModel::GetConfig()->Get('transactions_file_lifetime');
$sPattern = $sTransactionDir ? "$sTransactionDir/*" : utils::GetDataPath().'transactions/*';
$aTransactions = glob($sPattern);
foreach ($aTransactions as $sFileName) {

View File

@@ -1833,10 +1833,15 @@ SQL;
/**
* Some characters cause troubles with jQuery when used inside DOM IDs, so let's replace them by the safe _ (underscore)
* @param string $sId The ID to sanitize
* @param bool $bForSelector Whether to apply strict CSS/jQuery selector-safe sanitization
* @return string The sanitized ID
*/
public static function GetSafeId($sId)
public static function GetSafeId($sId, bool $bForSelector = false)
{
if ($bForSelector) {
return preg_replace('/[^a-zA-Z0-9_]/', '_', $sId);
}
return str_replace([':', '[', ']', '+', '-', ' '], '_', $sId);
}
@@ -3249,4 +3254,48 @@ TXT
return (int)$sLimit;
}
}
/**
* @since 3.3.0 N°9875
* Open archive and raise appropriate exception.
* Warning: do not forget to close archive afterwhile
* @param string $sArchiveFilePath
* @param int|null $flags
* @return ZipArchive
* @throws \Exception
*/
public static function ZipArchiveOpen(string $sArchiveFilePath, int|null $flags = null): ZipArchive
{
$oZip = new ZipArchive();
if (is_null($flags)) {
$code = $oZip->open($sArchiveFilePath);
} else {
$code = $oZip->open($sArchiveFilePath, $flags);
}
if (true !== $code) {
//ZipArchive::ZIP_ER_NOZIP : 19
if ($code === 19) {
throw new \Exception(sprintf('Cannot open zip file due to inconsistent or empty content'));
}
throw new \Exception(sprintf('Cannot open zip file due to error code %s', $code));
}
return $oZip;
}
/**
* @since 3.3.0 N°9875
* @param string $sDirectory
* @param string $sPrefix
* @return ZipArchive
* @throws \Exception
*/
public static function ZipArchiveCreateWithTempNam(string $sDirectory, string $sPrefix): ZipArchive
{
$sTempnam = tempnam($sDirectory, $sPrefix);
unlink($sTempnam);
$sArchiveName = $sTempnam.'.zip';
return self::ZipArchiveOpen($sArchiveName, ZipArchive::CREATE);
}
}

View File

@@ -11,7 +11,7 @@ define('APPCONF', APPROOT.'conf/');
*
* @see ITOP_CORE_VERSION to get full iTop core version
*/
define('ITOP_DESIGN_LATEST_VERSION', '3.3');
define('ITOP_DESIGN_LATEST_VERSION', '3.4');
/**
* Constant containing the iTop core version, whatever application was built
@@ -23,7 +23,7 @@ define('ITOP_DESIGN_LATEST_VERSION', '3.3');
* @used-by utils::GetItopVersionWikiSyntax()
* @used-by iTopModulesPhpVersionIntegrationTest
*/
define('ITOP_CORE_VERSION', '3.3.0');
define('ITOP_CORE_VERSION', '3.4.0');
/**
* @var string

View File

@@ -29,7 +29,7 @@ define('ITOP_APPLICATION_SHORT', 'iTop');
*
* @see ITOP_CORE_VERSION to get iTop core version
*/
define('ITOP_VERSION', '3.3.0-dev');
define('ITOP_VERSION', '3.4.0-dev');
define('ITOP_VERSION_NAME', 'Fullmoon');
define('ITOP_REVISION', 'svn');
@@ -607,6 +607,14 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'attribute.max_actions_items' => [
'type' => 'integer',
'description' => 'Maximum number of actions to display before it\'s compacted into a single action (0 means no limit)',
'default' => 2,
'value' => 2,
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'email_asynchronous' => [
'type' => 'bool',
'description' => 'If set, the emails are sent off line, which requires cron.php to be activated. Exception: some features like the email test utility will force the serialized mode',
@@ -1288,6 +1296,14 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'transactions_file_lifetime' => [
'type' => 'integer',
'description' => 'Value in seconds for the lifetime of a transaction file (after this duration, the transaction will be invalid and the garbage collector could delete it). This only works if the "transaction_storage" parameter is set to "File".',
'default' => 3600,
'value' => '',
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'log_transactions' => [
'type' => 'bool',
'description' => 'Whether or not to enable the debug log for the transactions.',
@@ -1749,8 +1765,8 @@ class Config
'security.disable_joined_classes_filter' => [
'type' => 'bool',
'description' => 'If true, scope filters aren\'t applied to joined classes or union classes not directly listed in the SELECT clause.',
'default' => true,
'value' => true,
'default' => false,
'value' => false,
'source_of_value' => '',
'show_in_conf_sample' => false,
],
@@ -1765,8 +1781,8 @@ class Config
'security.disable_exec_forced_login_for_all_enpoints' => [
'type' => 'bool',
'description' => 'If true, when no delegated authentication module is defined, no login will be forced on modules exec endpoints',
'default' => true,
'value' => true,
'default' => false,
'value' => false,
'source_of_value' => '',
'show_in_conf_sample' => false,
],

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.4">
<classes>
<class id="lnkActionNotificationToContact" _delta="define">
<parent>DBObject</parent>

View File

@@ -1945,7 +1945,7 @@ class DBObjectSearch extends DBSearch
$oSearch = $this;
$aClassesToFilter = $this->GetSelectedClasses();
// Opt-in for joined classes filtering, otherwise only filter the selected class(es)
// Joined classes filtering can be disabled through the configuration.
if (MetaModel::GetConfig()->Get('security.disable_joined_classes_filter') === false) {
$aClassesToFilter = $this->GetJoinedClasses();
}

View File

@@ -683,7 +683,7 @@ class DBUnionSearch extends DBSearch
return $this;
}
// Opt-in for joined classes filtering, otherwise fallback on DBSearch filtering
// Joined classes filtering can be disabled through the configuration.
if (MetaModel::GetConfig()->Get('security.disable_joined_classes_filter') === true) {
return parent::ApplyDataFilters();
}

View File

@@ -6866,10 +6866,24 @@ abstract class MetaModel
require_once(APPROOT.'/core/dict.class.inc.php');
Dict::ResetCache($sAppIdentity);
$iApcDeleteFailureCount = 0;
if (function_exists('apc_delete')) {
foreach (self::GetCacheEntries($sEnvironmentId) as $sKey => $aAPCInfo) {
$sAPCKey = $aAPCInfo['info'];
apc_delete($sAPCKey);
if (!apc_delete($sAPCKey)) {
$iApcDeleteFailureCount++;
}
}
}
if ($iApcDeleteFailureCount > 0) {
SetupLog::Warning("apc_delete failed for $iApcDeleteFailureCount entries for env $sEnvironment");
}
if (function_exists('apc_clear_cache')) {
// old style APC
if (!apc_clear_cache()) {
SetupLog::Warning("apc_clear_cache failed for env $sEnvironment");
}
}
@@ -6879,7 +6893,9 @@ abstract class MetaModel
// Reset the opcache since otherwise the PHP "model" files may still be cached !!
if (function_exists('opcache_reset')) {
// Zend opcode cache
opcache_reset();
if (!opcache_reset()) {
SetupLog::Warning("opcache_reset failed for env $sEnvironment");
}
}
require_once(APPROOT.'setup/setuputils.class.inc.php');

View File

@@ -325,7 +325,7 @@ EOF
$sQueryId = utils::ReadParam('query', null, true);
$sFields = utils::ReadParam('fields', null, true, 'raw_data');
if ((($sFields === null) || ($sFields === '')) && ($sQueryId === null)) {
throw new BulkExportMissingParameterException('fields');
$sFields = $this->GetFieldsFromQuery();
} else {
if (($sQueryId !== null) && ($sQueryId !== null)) {
$oSearch = DBObjectSearch::FromOQL('SELECT QueryOQL WHERE id = :query_id', ['query_id' => $sQueryId]);
@@ -336,11 +336,11 @@ EOF
// No 'fields' parameter supplied, take the fields from the query phrasebook definition
$sFields = trim($oQuery->Get('fields'));
if ($sFields === '') {
throw new BulkExportMissingParameterException('fields');
$sFields = $this->GetFieldsFromQuery();
}
}
} else {
throw BulkExportException('Invalid value for the parameter: query. There is no Query Phrasebook with id = '.$sQueryId, Dict::Format('Core:BulkExport:InvalidParameter_Query', $sQueryId));
throw new BulkExportException('Invalid value for the parameter: query. There is no Query Phrasebook with id = '.$sQueryId, Dict::Format('Core:BulkExport:InvalidParameter_Query', $sQueryId));
}
}
}
@@ -348,6 +348,39 @@ EOF
$this->SetFields($sFields);
}
public function GetFieldsFromQuery(): string
{
if (is_null($this->oSearch)) {
throw new BulkExportMissingParameterException("fields");
}
$aSelectedClasses = $this->oSearch->GetSelectedClasses();
$aAuthorizedClasses = [];
$aFields = [];
foreach ($aSelectedClasses as $sAlias => $sClassName) {
if (UserRights::IsActionAllowed($sClassName, UR_ACTION_BULK_READ) == UR_ALLOWED_YES) {
$aAuthorizedClasses[$sAlias] = $sClassName;
}
}
foreach ($aAuthorizedClasses as $sAlias => $sClassName) {
foreach (MetaModel::ListAttributeDefs($sClassName) as $oAttribute) {
$sAttCode = $oAttribute->GetCode();
if (! $this->IsExportableField($sClassName, $sAttCode, $oAttribute)) {
continue;
}
$sCurrentAlias = utils::IsNullOrEmptyString($sAlias) ? "" : "$sAlias.";
$aFields[] = "{$sCurrentAlias}{$sAttCode}";
}
}
if (count($aFields) === 0) {
IssueLog::Error("User is not allowed to see any field for exported OQL");
throw new BulkExportMissingParameterException("fields");
}
return implode(',', $aFields);
}
public function SetFields($sFields)
{
// Interpret (and check) the list of fields

View File

@@ -42,7 +42,7 @@ css/backoffice/
|– vendors/ # Third-party libs, should be either:
| # - Overload of the lib SCSS variables (BEST way, but possible only if the lib exposes them. e.g. Bulma)
| # - Overload of the lib necessary CSS classes only (not great as it duplicates some rules in the browser, which add weight and computation. e.g. dataTables)
| # - Duplicate the lib CSS completly to insert SCSS variables (not great as it will be outdated when updating the lib itself. e.g. jQuery UI)
| # - Duplicate the lib CSS completely to insert SCSS variables (not great as it will be outdated when updating the lib itself. e.g. jQuery UI)
| |– _bulma-variables-overload.scss # Bulma CSS framework
| |– _jquery-ui.scss # jQuery UI
| ... # Etc…

View File

@@ -5,6 +5,8 @@
@import "alert";
@import "button";
@import "button-bar";
@import "button-separator";
@import "button-group";
@import "breadcrumbs";
@import "quick-create";

View File

@@ -0,0 +1,43 @@
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
$ibo-button-bar--gap: 2px !default;
$ibo-button-bar--track--gap: 6px !default;
/* button-bar.css */
ibo-button-bar{
display: flex;
flex-wrap: nowrap;
align-items: center;
position: relative;
gap: $ibo-button-bar--gap;
overflow: hidden;
}
/* Keep content visible even if JS initialization is delayed. */
ibo-button-bar .ibo-button-bar--track{
display: flex;
flex: 1 1 auto;
flex-wrap: nowrap;
overflow: hidden;
white-space: nowrap;
gap: $ibo-button-bar--track--gap;
align-items: center;
}
ibo-button-bar .ibo-button-bar--item{
flex: 0 0 auto;
white-space: nowrap;
}
ibo-button-bar .ibo-button-bar--item[hidden]{
display: none !important;
}
ibo-button-bar .ibo-button-bar--extra{
flex: 0 0 auto;
position: relative;
}

View File

@@ -0,0 +1,20 @@
/*
* @copyright Copyright (C) 2010-2026 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
$ibo-button-separator--width: 1px !default;
$ibo-button-separator--height: 16px !default;
$ibo-button-separator--margin-x: 0.75rem !default;
$ibo-button-separator--margin-y: $ibo-spacing-0 !default;
$ibo-button-separator--border-size: 1px !default;
$ibo-button-separator--border-color: $ibo-color-grey-500 !default;
.ibo-button-separator {
display: inline-flex;
border-right: $ibo-button-separator--border-size solid $ibo-button-separator--border-color;
width: $ibo-button-separator--width;
height: $ibo-button-separator--height;
margin: $ibo-button-separator--margin-y $ibo-button-separator--margin-x;
}

View File

@@ -37,6 +37,12 @@ $ibo-field--enable-bulk--border-radius: $ibo-border-radius-500 !default;
$ibo-field--enable-bulk--checkbox--margin-left: $ibo-spacing-300 !default;
$ibo-field--label--action--margin-y: $ibo-spacing-0 !default;
$ibo-field--label--action--margin-x: $ibo-spacing-100 !default;
$ibo-field--label--action--size: $ibo-field--fullscreen-toggler--size !default;
$ibo-field--label--action--padding: $ibo-spacing-0 !default;
$ibo-field--label--action--font-size: $ibo-font-size-50 !default;
/* SCSS rules */
.ibo-field {
@extend %ibo-font-size-150;
@@ -264,4 +270,32 @@ $ibo-field--enable-bulk--checkbox--margin-left: $ibo-spacing-300 !default;
.ibo-input-select--action-buttons a {
@extend %ibo-hyperlink-inherited-colors;
}
.ibo-field--label {
.ibo-field--action:not(.ibo-button-separator) {
display: inline-flex;
align-content: center;
align-items: center;
justify-content: center;
vertical-align: middle;
width: $ibo-field--label--action--size;
height: $ibo-field--label--action--size;
padding: $ibo-field--label--action--padding;
border-radius: $ibo-field--fullscreen-toggler--border-radius;
font-size: $ibo-field--label--action--font-size;
~ .ibo-field--action {
margin-left: $ibo-field--label--action--margin-x;
}
}
.ibo-field--action.ibo-button-separator {
margin: $ibo-field--label--action--margin-y $ibo-field--label--action--margin-x;
vertical-align: middle;
}
}
// Specific rule to ensure that the grouped actions popover of a field is visible in fullscreen mode
body.ibo-has-fullscreen-descendant .ibo-popover-menu.ibo-field--grouped-actions-popover {
z-index: 1060 !important;
}

View File

@@ -21,6 +21,7 @@ $ibo-input-set--item--padding-x: 6px !default;
$ibo-input-set--item--padding-y: $ibo-spacing-200 !default;
$ibo-input-set--item--max-width: 360px !default;
$ibo-input-set--item--background-color: $ibo-color-white-100 !default;
$ibo-input-set--item--color: $ibo-color-grey-900 !default;
$ibo-input-set--item--border: none !default;
$ibo-input-set--item--border-radius: $ibo-border-radius-300 !default;
$ibo-input-set--item--box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15), 0 0 1px 1px rgba(241, 241, 241, 0.7) !default;
@@ -59,7 +60,7 @@ $ibo-input-set--item--box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15), 0 0 1px 1px rgb
border-radius: $ibo-input-set--item--border-radius;
box-shadow: $ibo-input-set--item--box-shadow;
color: $ibo-color-grey-900;
color: $ibo-input-set--item--color;
text-shadow: none;
@extend %ibo-text-truncated-with-ellipsis;
/* - Guaranty that if a set item has html sub-node, they correctly display ellipsis (eg. Link set set items) */

View File

@@ -4,7 +4,6 @@
*/
@import "navigation-menu";
@import "top-bar";
@import "content";
@import "details";
@import "tab-container/tab-container";
@@ -15,4 +14,5 @@
@import "wizard-container/wizard-container";
@import "object/all";
@import "activity-panel/all";
@import "extension/all";
@import "extension/all";
@import "top-bar/all";

View File

@@ -793,8 +793,9 @@ $ibo-navigation-menu--user-info--height--is-expanded: 100% !default;
color: $ibo-navigation-menu--user--text-color;
}
.ibo-navigation-menu--user-notifications--toggler--icon {
padding-left: $ibo-navigation-menu--user-notifications--toggler--icon--padding-left;
.ibo-navigation-menu--user-notifications--toggler--icon {
position: relative;
padding-left: $ibo-navigation-menu--user-notifications--toggler--icon--padding-left;
}
}

View File

@@ -0,0 +1,78 @@
$ibo-activity-panel--activity-actions--right: $ibo-activity-panel--add-caselog-entry-button--right !default;
$ibo-activity-panel--activity-actions--top: 76px + $ibo-activity-panel--activity-actions--right !default;
$ibo-activity-panel--activity-actions--gap: $ibo-spacing-300 !default;
$ibo-activity-panel--activity-action--diameter: $ibo-activity-panel--add-caselog-entry-button--diameter !default;
$ibo-activity-panel--activity-action--background-color: $ibo-activity-panel--add-caselog-entry-button--background-color !default;
$ibo-activity-panel--activity-action--background-color--on-hover: $ibo-activity-panel--add-caselog-entry-button--background-color--on-hover !default;
$ibo-activity-panel--activity-action--background-color--is-active: $ibo-activity-panel--add-caselog-entry-button--background-color--is-active !default;
$ibo-activity-panel--activity-action--color: $ibo-activity-panel--add-caselog-entry-button--color !default;
$ibo-activity-panel--activity-action--border-radius: $ibo-border-radius-full !default;
$ibo-activity-panel--activity-action--box-shadow: $ibo-activity-panel--add-caselog-entry-button--box-shadow !default;
$ibo-activity-panel--activity-action--hover--box-shadow: $ibo-activity-panel--add-caselog-entry-button--hover--box-shadow !default;
$ibo-activity-panel--activity-action--icon--height: $ibo-activity-panel--add-caselog-entry-button--icon--height !default;
$ibo-activity-panel--activity-action--icon--width: $ibo-activity-panel--activity-action--icon--height !default;
$ibo-activity-panel--activity-action--icon--font-size: $ibo-activity-panel--add-caselog-entry-button--icon--font-size !default;
$ibo-activity-panel--activity-action--icon--line-height: $ibo-activity-panel--add-caselog-entry-button--icon--line-height !default;
$ibo-activity-panel--activity-action-separator--width: calc(#{$ibo-activity-panel--activity-action--diameter} / 1.5) !default;
$ibo-activity-panel--activity-action-separator--height: 2px !default;
$ibo-activity-panel--activity-action-separator--background-color: $ibo-color-grey-500 !default;
.ibo-activity-panel--activity-actions {
display: flex;
flex-direction: column;
gap: $ibo-activity-panel--activity-actions--gap;
position: absolute;
z-index: 1;
right: $ibo-activity-panel--activity-actions--right;
top: $ibo-activity-panel--activity-actions--top;
&.ibo-is-hidden{
display: none;
}
&:has(+ .ibo-activity-panel--add-caselog-entry-button) {
top: calc(#{$ibo-activity-panel--activity-actions--top} + #{$ibo-activity-panel--activity-action--diameter} + #{$ibo-activity-panel--activity-actions--gap});
}
}
.ibo-activity-panel--activity-action {
@extend %ibo-baseline-centered-content;
width: $ibo-activity-panel--activity-action--diameter;
height: $ibo-activity-panel--activity-action--diameter;
background-color: $ibo-activity-panel--activity-action--background-color;
color: $ibo-activity-panel--activity-action--color;
border-radius: $ibo-activity-panel--activity-action--border-radius;
box-shadow: $ibo-activity-panel--activity-action--box-shadow;
> i{
text-align: center;
height: $ibo-activity-panel--activity-action--icon--height;
width: $ibo-activity-panel--activity-action--icon--width;
font-size: $ibo-activity-panel--activity-action--icon--font-size;
line-height: $ibo-activity-panel--activity-action--icon--line-height;
}
&:hover {
color: $ibo-activity-panel--activity-action--color;
background-color: $ibo-activity-panel--activity-action--background-color--on-hover;
box-shadow: $ibo-activity-panel--activity-action--hover--box-shadow;
}
&:active {
color: $ibo-activity-panel--activity-action--color;
background-color: $ibo-activity-panel--activity-action--background-color--is-active;
}
&.ibo-is-hidden{
display: none;
}
}
.ibo-activity-panel--activity-action-separator {
display: block;
width: $ibo-activity-panel--activity-action-separator--width;
height: $ibo-activity-panel--activity-action-separator--height;
margin: auto;
background-color: $ibo-activity-panel--activity-action-separator--background-color;
}

View File

@@ -137,7 +137,8 @@ $ibo-activity-panel--open-icon--margin-left: 0.75rem !default;
.ibo-activity-panel--header,
.ibo-activity-panel--body,
.ibo-activity-panel--add-caselog-entry-button {
.ibo-activity-panel--add-caselog-entry-button,
.ibo-activity-panel--activity-actions{
display: none;
}

View File

@@ -10,3 +10,4 @@
@import "transition-entry";
@import "edits-entry";
@import "notification-entry";
@import "activity-action";

View File

@@ -59,4 +59,9 @@ $ibo-caselog-entry-form--lock-message--margin-left: 1rem !default;
}
.ibo-caselog-entry-form--action-buttons--main-actions > .ibo-popover-menu {
z-index: 1;
}
.ibo-caselog-entry-form--action-buttons--extra-actions{
overflow: hidden;
flex-grow: 1;
}

View File

@@ -0,0 +1,2 @@
@import "top-bar";
@import "top-bar-action";

View File

@@ -0,0 +1,40 @@
$ibo-top-bar-quick-action--head--background-color: $ibo-color-white-100 !default;
$ibo-top-bar-quick-action--icon-padding-x: $ibo-spacing-500 !default;
$ibo-top-bar-quick-action--icon-padding-y: $ibo-spacing-0 !default;
$ibo-top-bar-quick-action--icon--color: $ibo-color-primary-600 !default;
$ibo-top-bar-quick-action--icon--color--on-hover: $ibo-color-primary-700 !default;
$ibo-top-bar-quick-action--icon--color--on-active: $ibo-color-primary-800 !default;
$ibo-top-bar-quick-action-separator--width: 2px !default;
$ibo-top-bar-quick-action-separator--background-color: $ibo-color-grey-300 !default;
$ibo-top-bar-quick-action-separator--margin-y: $ibo-spacing-0 !default;
$ibo-top-bar-quick-action-separator--margin-x: $ibo-spacing-300 !default;
.ibo-top-bar-quick-action{
position: relative;
@extend %ibo-full-height-content;
}
.ibo-top-bar-quick-action--head{
@extend %ibo-full-height-content;
height: 100%;
background-color: $ibo-top-bar-quick-action--head--background-color;
}
.ibo-top-bar-quick-action--icon{
color: $ibo-top-bar-quick-action--icon--color;
align-self: center;
padding: $ibo-top-bar-quick-action--icon-padding-y $ibo-top-bar-quick-action--icon-padding-x;
@extend %ibo-font-ral-nor-400;
&:hover{
color: $ibo-top-bar-quick-action--icon--color--on-hover;
}
&:active{
color: $ibo-top-bar-quick-action--icon--color--on-active;
}
}
.ibo-top-bar-quick-action-separator {
width: $ibo-top-bar-quick-action-separator--width;
background-color: $ibo-top-bar-quick-action-separator--background-color;
margin: $ibo-top-bar-quick-action-separator--margin-y $ibo-top-bar-quick-action-separator--margin-x;
}

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.4">
<constants>
</constants>
<classes>

View File

@@ -3,10 +3,13 @@
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://opensource.org/licenses/AGPL-3.0
*
*/
/**
*
*/
Dict::Add('EN GB', 'British English', 'British English', [
'CAS:Error:UserNotAllowed' => 'User not allowed',
'CAS:Login:SignIn' => 'Sign in with CAS',

View File

@@ -1,12 +1,15 @@
<?php
/**
* Spanish Localized data
* Localized data
*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://opensource.org/licenses/AGPL-3.0
*
*/
/**
* @author Miguel Turrubiates <miguel_tf@yahoo.com>
* @notas Utilizar codificación UTF-8 para mostrar acentos y otros caracteres especiales
*
*/
Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [
'CAS:Error:UserNotAllowed' => 'Usuario no permitido',

View File

@@ -5,8 +5,11 @@
*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://opensource.org/licenses/AGPL-3.0
*
*/
/**
*
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', [
'CAS:Error:UserNotAllowed' => '用户被禁止登录',
'CAS:Login:SignIn' => '使用 CAS 登录',

View File

@@ -6,7 +6,7 @@
SetupWebPage::AddModule(
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
'authent-cas/3.3.0',
'authent-cas/3.4.0',
[
// Identification
//

View File

@@ -3,39 +3,13 @@
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license https://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://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
* 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/>
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: UserExternal
//
Dict::Add('EN GB', 'British English', 'British English', [
'Class:UserExternal' => 'External user',
'Class:UserExternal+' => 'User authentified outside of '.ITOP_APPLICATION_SHORT,

View File

@@ -1,12 +1,15 @@
<?php
/**
* Spanish Localized data
* Localized data
*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://opensource.org/licenses/AGPL-3.0
*
*/
/**
* @author Miguel Turrubiates <miguel_tf@yahoo.com>
* @notas Utilizar codificación UTF-8 para mostrar acentos y otros caracteres especiales
*
*/
Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [
'Class:UserExternal' => 'Usuario externo',

View File

@@ -12,5 +12,5 @@
*/
Dict::Add('HU HU', 'Hungarian', 'Magyar', [
'Class:UserExternal' => 'Külső felhasználó',
'Class:UserExternal+' => '',
'Class:UserExternal+' => 'User authentified outside of '.ITOP_APPLICATION_SHORT.'~~',
]);

View File

@@ -12,5 +12,5 @@
*/
Dict::Add('PT BR', 'Brazilian', 'Brazilian', [
'Class:UserExternal' => 'Usuário externo',
'Class:UserExternal+' => '',
'Class:UserExternal+' => 'User authentified outside of '.ITOP_APPLICATION_SHORT.'~~',
]);

View File

@@ -5,37 +5,12 @@
*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://opensource.org/licenses/AGPL-3.0
* @author Robert Deng <denglx@gmail.com>
* 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/>
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: UserExternal
//
/**
* @author Robert Deng <denglx@gmail.com>
*
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', [
'Class:UserExternal' => '外部用户',
'Class:UserExternal+' => '用户在'.ITOP_APPLICATION_SHORT.'外部验证身份',

View File

@@ -27,7 +27,7 @@
SetupWebPage::AddModule(
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
'authent-external/3.3.0',
'authent-external/3.4.0',
[
// Identification
//

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.4">
<classes>
<class id="UserLDAP" _delta="define">
<parent>cmdbAbstractObject</parent>

View File

@@ -16,13 +16,6 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', [
'Class:UserLDAP' => 'LDAP uživatel',
'Class:UserLDAP+' => 'Uživatel ověřen přes LDAP',
'UserLDAP:server' => 'Specifika LDAP',
]);
//
// Class: UserLDAP
//
Dict::Add('CS CZ', 'Czech', 'Čeština', [
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
]);

View File

@@ -15,13 +15,6 @@ Dict::Add('DA DA', 'Danish', 'Dansk', [
'Class:UserLDAP' => 'LDAP-Bruger',
'Class:UserLDAP+' => 'Bruger der godkendes via LDAP',
'UserLDAP:server' => 'LDAP specifics~~',
]);
//
// Class: UserLDAP
//
Dict::Add('DA DA', 'Danish', 'Dansk', [
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
]);

View File

@@ -15,13 +15,6 @@ Dict::Add('DE DE', 'German', 'Deutsch', [
'Class:UserLDAP' => 'LDAP-Benutzer',
'Class:UserLDAP+' => 'Benutzer, der via LDAP authentifiziert wird',
'UserLDAP:server' => 'LDAP-Einstellungen',
]);
//
// Class: UserLDAP
//
Dict::Add('DE DE', 'German', 'Deutsch', [
'Class:UserLDAP/Attribute:ldap_server' => 'LDAP-Server',
'Class:UserLDAP/Attribute:ldap_server+' => 'Optional: LDAP-Server, der zur Authentifizierung verwendet werden soll, falls mehrere LDAP-Server konfiguriert sind.',
]);

View File

@@ -3,41 +3,17 @@
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://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
* 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/>
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: UserLDAP
//
Dict::Add('EN GB', 'British English', 'British English', [
'Class:UserLDAP' => 'LDAP user',
'Class:UserLDAP+' => 'User authenticated by LDAP',
'UserLDAP:server' => 'LDAP specifics',
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
]);

View File

@@ -1,24 +1,20 @@
<?php
/**
* Spanish Localized data
* Localized data
*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://opensource.org/licenses/AGPL-3.0
*
*/
/**
* @author Miguel Turrubiates <miguel_tf@yahoo.com>
* @notas Utilizar codificación UTF-8 para mostrar acentos y otros caracteres especiales
*
*/
Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [
'Class:UserLDAP' => 'Usuario LDAP',
'Class:UserLDAP+' => 'Usuario autenticado vía LDAP',
'UserLDAP:server' => 'Especificaciones LDAP',
]);
//
// Class: UserLDAP
//
Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
]);

View File

@@ -14,13 +14,6 @@ Dict::Add('FR FR', 'French', 'Français', [
'Class:UserLDAP' => 'Utilisateur LDAP',
'Class:UserLDAP+' => 'Utilisateur authentifié par un serveur LDAP',
'UserLDAP:server' => 'Champs spécifiques pour LDAP',
]);
//
// Class: UserLDAP
//
Dict::Add('FR FR', 'French', 'Français', [
'Class:UserLDAP/Attribute:ldap_server' => 'Serveur LDAP',
'Class:UserLDAP/Attribute:ldap_server+' => 'Serveur LDAP utilisé pour l\'authentification de cet utilisateur',
]);

View File

@@ -14,13 +14,6 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', [
'Class:UserLDAP' => 'LDAP felhasználó',
'Class:UserLDAP+' => 'LDAP vagy AD felhasználó',
'UserLDAP:server' => 'LDAP specifics~~',
]);
//
// Class: UserLDAP
//
Dict::Add('HU HU', 'Hungarian', 'Magyar', [
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
]);

View File

@@ -14,13 +14,6 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
'Class:UserLDAP' => 'Utente LDAP',
'Class:UserLDAP+' => 'Utente autenticato da LDAP',
'UserLDAP:server' => 'Specifiche LDAP',
]);
//
// Class: UserLDAP
//
Dict::Add('IT IT', 'Italian', 'Italiano', [
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
]);

View File

@@ -15,13 +15,6 @@ Dict::Add('JA JP', 'Japanese', '日本語', [
'Class:UserLDAP' => 'LDAP ユーザー',
'Class:UserLDAP+' => 'LDAP認証ユーザー',
'UserLDAP:server' => 'LDAP specifics~~',
]);
//
// Class: UserLDAP
//
Dict::Add('JA JP', 'Japanese', '日本語', [
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
]);

View File

@@ -10,18 +10,12 @@
/**
* @author Thomas Casteleyn <thomas.casteleyn@super-visions.com>
* @author Jeffrey Bostoen <info@jeffreybostoen.be> (2018 - 2022)
*
*/
Dict::Add('NL NL', 'Dutch', 'Nederlands', [
'Class:UserLDAP' => 'LDAP-gebruiker',
'Class:UserLDAP+' => 'Gebruiker die aanmeldt via LDAP',
'UserLDAP:server' => 'LDAP informatie',
]);
//
// Class: UserLDAP
//
Dict::Add('NL NL', 'Dutch', 'Nederlands', [
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
]);

View File

@@ -14,13 +14,6 @@ Dict::Add('PL PL', 'Polish', 'Polski', [
'Class:UserLDAP' => 'Użytkownik LDAP',
'Class:UserLDAP+' => 'Użytkownik uwierzytelniony przez LDAP',
'UserLDAP:server' => 'Serwer LDAP',
]);
//
// Class: UserLDAP
//
Dict::Add('PL PL', 'Polish', 'Polski', [
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
]);

View File

@@ -12,15 +12,8 @@
*/
Dict::Add('PT BR', 'Brazilian', 'Brazilian', [
'Class:UserLDAP' => 'Usuário externo via LDAP',
'Class:UserLDAP+' => '',
'Class:UserLDAP+' => 'User authenticated by LDAP~~',
'UserLDAP:server' => 'LDAP specifics~~',
]);
//
// Class: UserLDAP
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', [
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
]);

View File

@@ -15,13 +15,6 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
'Class:UserLDAP' => 'Пользователь LDAP',
'Class:UserLDAP+' => 'Пользователь, аутентифицируемый через LDAP',
'UserLDAP:server' => 'Особенности LDAP',
]);
//
// Class: UserLDAP
//
Dict::Add('RU RU', 'Russian', 'Русский', [
'Class:UserLDAP/Attribute:ldap_server' => 'Сервер LDAP',
'Class:UserLDAP/Attribute:ldap_server+' => '',
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
]);

View File

@@ -14,13 +14,6 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', [
'Class:UserLDAP' => 'LDAP užívateľ',
'Class:UserLDAP+' => 'User authenticated by LDAP~~',
'UserLDAP:server' => 'LDAP specifics~~',
]);
//
// Class: UserLDAP
//
Dict::Add('SK SK', 'Slovak', 'Slovenčina', [
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
]);

View File

@@ -15,13 +15,6 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', [
'Class:UserLDAP' => 'LDAP kullanıcısı',
'Class:UserLDAP+' => 'Yetki kontrolü LDAP tarafından yapılan',
'UserLDAP:server' => 'LDAP specifics~~',
]);
//
// Class: UserLDAP
//
Dict::Add('TR TR', 'Turkish', 'Türkçe', [
'Class:UserLDAP/Attribute:ldap_server' => 'Ldap server~~',
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
]);

View File

@@ -5,48 +5,16 @@
*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://opensource.org/licenses/AGPL-3.0
* @author Robert Deng <denglx@gmail.com>
* 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/>
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: UserLDAP
//
/**
* @author Robert Deng <denglx@gmail.com>
*
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', [
'Class:UserLDAP' => 'LDAP 用户',
'Class:UserLDAP+' => '用户身份由 LDAP 认证',
'UserLDAP:server' => 'LDAP 详情',
]);
//
// Class: UserLDAP
//
Dict::Add('ZH CN', 'Chinese', '简体中文', [
'Class:UserLDAP/Attribute:ldap_server' => 'LDAP 服务器',
'Class:UserLDAP/Attribute:ldap_server+' => '',
'Class:UserLDAP/Attribute:ldap_server+' => '~~',
]);

View File

@@ -7,7 +7,7 @@ if (function_exists('ldap_connect')) {
SetupWebPage::AddModule(
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
'authent-ldap/3.3.0',
'authent-ldap/3.4.0',
[
// Identification
//

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.4">
<module_parameters>
<parameters id="authent-local" _delta="define">
<password_validation.pattern>^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{12,}$</password_validation.pattern>

View File

@@ -16,7 +16,7 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', [
'Class:UserLocal' => 'interní uživatel '.ITOP_APPLICATION_SHORT,
'Class:UserLocal+' => 'Uživatel ověřen interně v '.ITOP_APPLICATION_SHORT,
'Class:UserLocal/Attribute:password' => 'Heslo',
'Class:UserLocal/Attribute:password+' => '',
'Class:UserLocal/Attribute:password+' => 'User authentication string~~',
'Class:UserLocal/Attribute:expiration' => 'Exspirace hesla',
'Class:UserLocal/Attribute:expiration+' => 'Status exspirace hesla (je vyžadováno rozšíření, aby mělo efekt)',
'Class:UserLocal/Attribute:expiration/Value:can_expire' => 'Může exspirovat',

View File

@@ -19,13 +19,13 @@ Dict::Add('DE DE', 'German', 'Deutsch', [
'Class:UserLocal/Attribute:expiration' => 'Passwortablauf',
'Class:UserLocal/Attribute:expiration+' => 'Passwortablaufstatus (statusabhängige Effekte müssen per Extension implementiert werden)',
'Class:UserLocal/Attribute:expiration/Value:can_expire' => 'kann ablaufen',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:never_expire' => 'läuft nie ab',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:force_expire' => 'abgelaufen',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:otp_expire' => 'einmaliges Passwort',
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Das Passwort kann vom Benutzer nicht geändert werden.',
'Class:UserLocal/Attribute:password_renewed_date' => 'Letzte Passworterneuerung',
'Class:UserLocal/Attribute:password_renewed_date+' => 'Letztes Änderungsdatum',
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Das Passwort muss mindestens 12 Zeichen lang sein und Großbuchstaben, Kleinbuchstaben, Zahlen und Sonderzeichen enthalten.',

View File

@@ -3,58 +3,30 @@
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://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
* 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/>
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: UserLocal
//
Dict::Add('EN GB', 'British English', 'British English', [
'Class:UserLocal' => ITOP_APPLICATION_SHORT.' user',
'Class:UserLocal+' => 'User authentified by '.ITOP_APPLICATION_SHORT,
'Class:UserLocal/Attribute:password' => 'Password',
'Class:UserLocal/Attribute:password+' => 'User authentication string',
'Class:UserLocal/Attribute:expiration' => 'Password expiration',
'Class:UserLocal/Attribute:expiration+' => 'Password expiration status (requires an extension to have an effect)',
'Class:UserLocal/Attribute:expiration/Value:can_expire' => 'Can expire',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:never_expire' => 'Never expire',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:force_expire' => 'Expired',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:otp_expire' => 'One-time Password',
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.',
'Class:UserLocal/Attribute:password_renewed_date' => 'Password renewed on',
'Class:UserLocal/Attribute:password_renewed_date+' => 'When the password was last changed',
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Password must be at least 12 characters and include uppercase, lowercase, numeric and special characters.',
'UserLocal:password:expiration' => 'The fields below require an extension',
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User',

View File

@@ -1,12 +1,15 @@
<?php
/**
* Spanish Localized data
* Localized data
*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://opensource.org/licenses/AGPL-3.0
*
*/
/**
* @author Miguel Turrubiates <miguel_tf@yahoo.com>
* @notas Utilizar codificación UTF-8 para mostrar acentos y otros caracteres especiales
*
*/
Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [
'Class:UserLocal' => 'Usuario de '.ITOP_APPLICATION_SHORT,
@@ -16,11 +19,11 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [
'Class:UserLocal/Attribute:expiration' => 'Expiración de contraseña',
'Class:UserLocal/Attribute:expiration+' => 'Estatus de expiración de contraseña (requiere de una extensión para que tenga efecto)',
'Class:UserLocal/Attribute:expiration/Value:can_expire' => 'Puede expirar',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:never_expire' => 'Nunca expirar',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:force_expire' => 'Expirado',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:otp_expire' => 'Contraseña de un solo uso',
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'El usuario no puede cambiar la contraseña.',
'Class:UserLocal/Attribute:password_renewed_date' => 'Renovación de contraseña',

View File

@@ -14,17 +14,17 @@ Dict::Add('FR FR', 'French', 'Français', [
'Class:UserLocal' => 'Utilisateur '.ITOP_APPLICATION_SHORT,
'Class:UserLocal+' => 'Utilisateur authentifié par '.ITOP_APPLICATION_SHORT,
'Class:UserLocal/Attribute:password' => 'Mot de passe',
'Class:UserLocal/Attribute:password+' => '',
'Class:UserLocal/Attribute:password+' => 'User authentication string~~',
'Class:UserLocal/Attribute:expiration' => 'Validité du mot de passe',
'Class:UserLocal/Attribute:expiration+' => 'État du mot de passe (nécessite une extension pour avoir un effet)',
'Class:UserLocal/Attribute:expiration/Value:can_expire' => 'Durée limitée',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:never_expire' => 'Permanente',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:force_expire' => 'A changer à la prochaine connexion',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:otp_expire' => 'Usage unique',
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Password cannot be changed by the user.~~',
'Class:UserLocal/Attribute:password_renewed_date' => 'Mot de passe changé le',
'Class:UserLocal/Attribute:password_renewed_date+' => 'Dernière date à laquelle le mot de passe a été changé',
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Le mot de passe doit contenir au moins 12 caractères, avec minuscule, majuscule, nombre et caractère spécial.',

View File

@@ -14,7 +14,7 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', [
'Class:UserLocal' => ITOP_APPLICATION_SHORT.' felhasználó',
'Class:UserLocal+' => 'Rendszeren belül létrehozott felhasználó',
'Class:UserLocal/Attribute:password' => 'Jelszó',
'Class:UserLocal/Attribute:password+' => '',
'Class:UserLocal/Attribute:password+' => 'User authentication string~~',
'Class:UserLocal/Attribute:expiration' => 'Jelszó lejárati ideje',
'Class:UserLocal/Attribute:expiration+' => 'Jelszó lejárati státusz (bővítmény szükséges hozzá)',
'Class:UserLocal/Attribute:expiration/Value:can_expire' => 'Lejár',

View File

@@ -19,11 +19,11 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
'Class:UserLocal/Attribute:expiration' => 'Wachtwoord verloopt',
'Class:UserLocal/Attribute:expiration+' => 'Of het wachtwoord al dan niet verlopen is (vereist een extensie vooraleer dit werkt)',
'Class:UserLocal/Attribute:expiration/Value:can_expire' => 'Kan verlopen',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:never_expire' => 'Verloopt nooit',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:force_expire' => 'Moet veranderd worden',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:otp_expire' => 'Eenmalig wachtwoord',
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'De gebruiker kan dit wachtwoord niet veranderen.',
'Class:UserLocal/Attribute:password_renewed_date' => 'Wachtwoord laatst aangepast',

View File

@@ -18,11 +18,11 @@ Dict::Add('PL PL', 'Polish', 'Polski', [
'Class:UserLocal/Attribute:expiration' => 'Wygaśnięcie hasła',
'Class:UserLocal/Attribute:expiration+' => 'Stan wygaśnięcia hasła (wymaga rozszerzenia, aby zadziałało)',
'Class:UserLocal/Attribute:expiration/Value:can_expire' => 'Może wygasnąć',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:never_expire' => 'Nigdy nie wygasa',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:force_expire' => 'Wygasło',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:otp_expire' => 'Jednorazowe hasło',
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Hasło nie może być zmienione przez użytkownika.',
'Class:UserLocal/Attribute:password_renewed_date' => 'Odnowienie hasła',

View File

@@ -12,17 +12,17 @@
*/
Dict::Add('PT BR', 'Brazilian', 'Brazilian', [
'Class:UserLocal' => 'Usuário local',
'Class:UserLocal+' => '',
'Class:UserLocal+' => 'User authentified by '.ITOP_APPLICATION_SHORT.'~~',
'Class:UserLocal/Attribute:password' => 'Senha',
'Class:UserLocal/Attribute:password+' => '',
'Class:UserLocal/Attribute:password+' => 'User authentication string~~',
'Class:UserLocal/Attribute:expiration' => 'Expiração da senha',
'Class:UserLocal/Attribute:expiration+' => 'Status de expiração de senha (Requer uma extensão para fazer efeito)',
'Class:UserLocal/Attribute:expiration/Value:can_expire' => 'Senha expira',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:never_expire' => 'Senha nunca expira',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:force_expire' => 'Senha expirada',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:otp_expire' => 'One-Time Password (OTP)',
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Senha não pode ser alterada pelo usuário',
'Class:UserLocal/Attribute:password_renewed_date' => 'Data da última alteração de senha',

View File

@@ -19,11 +19,11 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
'Class:UserLocal/Attribute:expiration' => 'Срок действия пароля',
'Class:UserLocal/Attribute:expiration+' => 'Статус срока действия пароля (требуется расширение для эффекта)',
'Class:UserLocal/Attribute:expiration/Value:can_expire' => 'Органиченный',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:never_expire' => 'Неограниченный',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:force_expire' => 'Истёкший',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:otp_expire' => 'Одноразовый пароль',
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => 'Пароль не может быть изменён пользователем.',
'Class:UserLocal/Attribute:password_renewed_date' => 'Дата изменения пароля',

View File

@@ -5,56 +5,29 @@
*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://opensource.org/licenses/AGPL-3.0
* @author Robert Deng <denglx@gmail.com>
* 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/>
*/
// Dictionnay conventions
// Class:<class_name>
// Class:<class_name>+
// Class:<class_name>/Attribute:<attribute_code>
// Class:<class_name>/Attribute:<attribute_code>+
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>
// Class:<class_name>/Attribute:<attribute_code>/Value:<value>+
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Class: UserLocal
//
/**
* @author Robert Deng <denglx@gmail.com>
*
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', [
'Class:UserLocal' => ITOP_APPLICATION_SHORT.' 用户',
'Class:UserLocal+' => '用户由'.ITOP_APPLICATION_SHORT.'验证身份',
'Class:UserLocal/Attribute:password' => '密码',
'Class:UserLocal/Attribute:password+' => '用于验证用户身份的字符串',
'Class:UserLocal/Attribute:expiration' => '密码过期时间',
'Class:UserLocal/Attribute:expiration+' => '密码过期状态 (需要扩展才能生效)',
'Class:UserLocal/Attribute:expiration/Value:can_expire' => '允许过期',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:can_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:never_expire' => '永不过期',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:never_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:force_expire' => '已过期',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '',
'Class:UserLocal/Attribute:expiration/Value:force_expire+' => '~~',
'Class:UserLocal/Attribute:expiration/Value:otp_expire' => '一次性密码',
'Class:UserLocal/Attribute:expiration/Value:otp_expire+' => '用户不允许修改密码.',
'Class:UserLocal/Attribute:password_renewed_date' => '密码更新时间',
'Class:UserLocal/Attribute:password_renewed_date+' => '上次修改密码的时间',
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => '密码必须至少12个字符, 包含大小写, 数字和特殊字符.',
'UserLocal:password:expiration' => '下面的区域需要插件扩展',
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => '不允许用户为自己设置 "一次性密码" 的失效期限',

View File

@@ -2,7 +2,7 @@
SetupWebPage::AddModule(
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
'authent-local/3.3.0',
'authent-local/3.4.0',
[
// Identification
//

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.4">
<branding>
<themes>
<theme id="darkmoon" _delta="define">

View File

@@ -3,25 +3,13 @@
/**
* Localized data
*
* @copyright Copyright (C) 2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://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
* 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/>
*/
Dict::Add('EN GB', 'British English', 'British English', [
'theme:darkmoon' => 'Dark moon',
]);

View File

@@ -1,12 +1,15 @@
<?php
/**
* Spanish Localized data
* Localized data
*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://opensource.org/licenses/AGPL-3.0
*
*/
/**
* @author Miguel Turrubiates <miguel_tf@yahoo.com>
* @notas Utilizar codificación UTF-8 para mostrar acentos y otros caracteres especiales
*
*/
Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [
'theme:darkmoon' => 'Luna Obscura',

View File

@@ -6,22 +6,10 @@
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license https://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
* 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/>
*/
/**
*
*/
Dict::Add('ZH CN', 'Chinese', '简体中文', [
'theme:darkmoon' => 'Dark moon',
]);

View File

@@ -6,7 +6,7 @@
SetupWebPage::AddModule(
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
'combodo-backoffice-darkmoon-theme/3.3.0',
'combodo-backoffice-darkmoon-theme/3.4.0',
[
// Identification
//

View File

@@ -149,6 +149,8 @@ $ibo-quick-create--input--text-color: $ibo-color-grey-100 !default;
$ibo-quick-create--input--placeholder-color: $ibo-color-grey-200 !default;
$ibo-quick-create--compartment-element--background-color--is-active: $ibo-color-grey-500 !default;
$ibo-top-bar-quick-action--head--background-color: $ibo-top-bar--background-color !default;
$ibo-datatable--toolbar--text-color: $ibo-color-grey-300 !default;
$ibo-vendors-datatables--pagination-button--background-color--on-hover: $ibo-color-grey-700 !default;
$ibo-vendors-datatables--pagination-button--text-color--is-active: $ibo-color-grey-200 !default;
@@ -200,6 +202,10 @@ $ibo-input-select-selectize--item--active--text-color: $ibo-color-grey-100 !defa
$ibo-input-select-selectize--item--active--background-color: $ibo-color-grey-500 !default;
$ibo-input-select--autocomplete-item-image--background-color: $ibo-color-grey-800 !default;
$ibo-input-date--button--color: $ibo-input-select--action-button--color;
$ibo-input-set--item--background-color: $ibo-color-grey-600 !default;
$ibo-input-set--item--color: $ibo-color-grey-200 !default;
$ibo-input-set--item--box-shadow: none !default;
$ibo-input-set--item--border: solid 1px $ibo-color-grey-800 !default;
$ibo-vendors-selectize-input--color: $ibo-body-text-color !default;
$ibo-vendors-selectize-input--background-color: $ibo-input--background-color !default;
$ibo-vendors-selectize--input--border-color: $ibo-input--border-color !default;

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.4">
<branding>
<themes>
<theme id="fullmoon-high-contrast" _delta="define">

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