Compare commits

..

222 Commits

Author SHA1 Message Date
3b5eaa7ad6 standardize comments in English 2026-03-30 05:04:04 +00:00
6a2030ef4a Merge branch hotfix/v9.3.1 into develop 2026-03-12 15:26:15 +00:00
a3e6482ff3 Merge branch release/v9.3.0 into develop 2026-02-25 15:15:38 +00:00
c27936c5c8 Merge branch release/v9.3.0 into master 2026-02-24 14:13:10 +00:00
7178e3065c [forms][js-api] Rework main class Api to the new scheme 2026-02-17 19:24:48 +03:00
3fb5b65794 [form] Add method to check if the form is signed 2026-02-02 18:52:59 +03:00
c9279dcdd8 Merge branch hotfix/v9.2.1 into release/v9.3.0 2025-12-17 15:33:39 +00:00
cd54c2bdff Merge branch hotfix/v9.2.1 into develop 2025-12-17 15:33:38 +00:00
e53ddb9003 Fix bug #78104 2025-12-05 15:28:14 +03:00
29c2f86cb8 Merge branch release/v9.2.0 into master 2025-12-01 07:30:49 +00:00
d1f67dce0d [de] Remove unnecessary onEndAction 2025-11-27 15:10:26 +03:00
f2901a3dc7 Fix bug #77996
Don't allow to insert other forms inside a fixed labeled checkbox
2025-11-25 21:51:40 +03:00
4678111e19 For bug #78163
Check symbols before specifying the default form value
2025-11-18 12:16:31 +03:00
4c31ee1427 Merge pull request 'Add data for macro writing' (#8) from fix/macro-record into release/v9.2.0 2025-11-01 13:08:00 +00:00
1daac752fa Add data for macro writing 2025-11-01 12:58:45 +03:00
22cbda0f3a [de] Don't return complex form if it is a labeled checkbox 2025-10-29 18:14:30 +03:00
8b80309475 Merge branch release/v9.1.0 into master 2025-10-14 14:42:32 +00:00
72b33b253a For bug #75654
Check required flag when adding the new radio button
2025-10-01 20:17:00 +03:00
7bbcacc622 [form] Export method isFinal 2025-09-30 18:17:27 +03:00
a0bfe66f9c Fix typo 2025-09-30 18:02:28 +03:00
db6cd158d0 [de][form] Add final flag 2025-09-30 17:59:54 +03:00
528997cc88 Fix bug #76932
Reset default role to the first role in oform after deleting it
2025-09-30 16:22:12 +03:00
5e6a7c5867 For bug #77034
Check if the current userMaster is a noRole
2025-09-26 16:45:33 +03:00
8b8364fd48 Fix bug #76932
Update the default role for the form, if it was delete
2025-09-24 18:18:31 +03:00
bdf97bf2f4 Merge branch 'develop' of git.onlyoffice.com:ONLYOFFICE/sdkjs-forms into develop 2025-07-10 17:46:14 +03:00
71dc14ae55 Merge remote-tracking branch 'remotes/origin/hotfix/v9.0.4' into develop 2025-07-10 17:45:49 +03:00
0cc7cdc5af Merge branch hotfix/v9.0.3 into master 2025-07-08 11:41:41 +00:00
b8170a57d7 Merge branch hotfix/v9.0.2 into develop 2025-07-07 14:43:02 +00:00
3fd132911e Merge pull request 'Added plugins events docs file' (#7) from fix/docs into hotfix/v9.0.3
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/sdkjs-forms/pulls/7
2025-07-07 14:13:13 +00:00
9274d360c0 Added plugins events docs file 2025-07-07 21:12:38 +07:00
e204301e1a [form] Add a method to mark all roles as filled at once 2025-07-03 01:20:33 +03:00
0d3b281cc3 [form] Clear user info when set the role unfilled 2025-07-01 16:49:10 +03:00
4a5b824f72 [form] Write date when the role was filled 2025-07-01 15:33:04 +03:00
d43cb71066 [form] Add userName/userEmail fields to a UserMaster 2025-07-01 10:51:50 +03:00
667a804085 [form] Add check if all roles were filled 2025-06-30 16:35:49 +03:00
2d1cac6992 Merge branch release/v9.0.0 into develop 2025-06-27 14:22:46 +00:00
031e0bbbbf Merge pull request '[forms][bu] Fix methods description' (#6) from release/v9.0.0 into master 2025-06-19 11:35:44 +00:00
9bee906735 [forms][bu] Fix methods description 2025-06-19 14:29:07 +03:00
bfe252fee3 Merge branch release/v9.0.0 into master 2025-06-18 09:27:10 +00:00
70503bde4c Merge pull request 'Api docs 9.0.0' (#5) from feature/api-docs-9.0.0 into release/v9.0.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/sdkjs-forms/pulls/5
2025-06-17 12:49:39 +00:00
9a88f0855a Merge branch 'release/v9.0.0' of git.onlyoffice.com:ONLYOFFICE/sdkjs-forms into feature/api-docs-9.0.0 2025-06-17 12:53:51 +03:00
ac12e3223c updated api docs 2025-06-17 12:53:41 +03:00
cb5cb83eb2 Merge remote-tracking branch 'remotes/origin/release/v9.0.0' into develop 2025-06-16 11:19:53 +03:00
00b3394113 Merge pull request 'fix/complex-form' (#4) from fix/complex-form into release/v9.0.0 2025-06-11 13:06:04 +00:00
930f507eaf [forms] Refactor 2025-06-11 16:04:22 +03:00
f31bb12081 Fix description CreateComplexForm 2025-06-07 07:37:50 +03:00
26236c2b6e Add CreateComplexForm 2025-06-07 07:33:12 +03:00
8e661ab8a9 [oform] Fix the size for inner shape of a signature form 2025-06-02 16:50:10 +03:00
bee4c2702c Merge pull request 'fix/roles-builder' (#3) from fix/roles-builder into release/v9.0.0 2025-05-28 17:08:38 +00:00
9446505728 [form] Add a default role to the new form if it isn't specified 2025-05-28 18:51:03 +03:00
d80cc23221 [de] Add ability so specify the role when adding form using office-js-api 2025-05-28 00:02:14 +03:00
a602d9aa36 [forms] Add methods to work with oform roles 2025-05-27 18:24:07 +03:00
ea7e3c0f02 Fix bug #70332
Convert drawing to inline form when adding picture content control
2025-05-05 16:55:41 +03:00
1da45dde0e For bug #71640
Add subforms to a complex form with the role name of the complex form
2025-04-30 12:03:09 +03:00
e1a98f8f4a Merge branch hotfix/v8.3.3 into develop 2025-04-21 09:08:04 +00:00
4ac368daa0 Merge branch hotfix/v8.3.3 into release/v9.0.0 2025-04-21 09:08:04 +00:00
58060100c9 Merge branch hotfix/v8.3.2 into develop 2025-04-01 08:39:13 +00:00
b8cbadfde6 Merge branch hotfix/v8.3.2 into release/v9.0.0 2025-04-01 08:39:13 +00:00
4732938f0a Merge branch hotfix/v8.3.2 into master 2025-03-19 12:50:23 +00:00
7505fadefe Fix bug #73572
Fix changing roles order
2025-03-17 18:32:49 +03:00
439c9b3085 [de] Don't translate default role name 2025-03-14 21:18:45 +03:00
f4d5a88be0 Merge pull request '[bu][plugins] Use Api in proto' (#2) from fix/bu-description into release/v9.0.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/sdkjs-forms/pulls/2
2025-03-06 11:36:13 +00:00
c8bff88071 [bu][plugins] Use Api in proto 2025-03-06 15:23:08 +07:00
4c765147b0 Merge branch hotfix/v8.3.1 into master 2025-02-27 13:22:08 +00:00
110a52a0b9 [oform] Add method to set all roles as not filled 2025-02-26 19:51:49 +03:00
ec29fcbcbc [oform] Fix writing fieldGroup to Xml 2025-02-19 21:17:16 +03:00
a60477955e [oform] Add a special type NoRole to prohib filling any field 2025-02-19 17:10:00 +03:00
097ac2ecbd Merge pull request 'fix/roles' (#1) from fix/roles into hotfix/v8.3.1 2025-02-19 11:31:18 +00:00
46d2220494 [oform] Add an event when current role is filled in 2025-02-19 14:16:26 +03:00
bb4bd422b3 [oform] Add method to set that role is filled 2025-02-19 13:00:30 +03:00
26fd5ac0e1 [de] Add method to check if we can fill in with the current role 2025-02-18 20:12:15 +03:00
c74119b351 [de] Add a parameter indicating that a group of fields (role) is filled 2025-02-18 19:41:14 +03:00
87e1f3d133 Merge branch release/v8.3.0 into master 2025-02-05 17:21:47 +00:00
c7f6274837 Merge branch hotfix/v8.2.1 into develop 2024-11-22 10:52:46 +00:00
7281602fe3 Merge branch release/v8.2.0 into develop 2024-10-21 11:53:54 +00:00
c85087988d Merge branch release/v8.2.0 into master 2024-10-17 11:13:47 +00:00
b7c3f2a81e [oform] Change the default signature placeholder and key 2024-10-14 00:22:02 +03:00
e92af5d616 Merge pull request #55 from ONLYOFFICE/fix/api-description
[bu]/[plugins] Fixed description
2024-08-16 05:50:32 -07:00
d762919e17 [bu]/[plugins] Fixed description 2024-08-16 18:48:43 +07:00
1e4faa1c44 [de] Implement method for adding signature field 2024-08-08 13:13:59 +03:00
f1ab48dbf6 [de][bu] Add tag property when creating a form 2024-08-05 17:50:37 +03:00
df86438f34 Merge pull request #53 from ONLYOFFICE/fix/plugins
[plugins][api] Added links to examples
2024-08-02 04:40:34 -07:00
0ce75cd435 [plugins][api] Added links to examples 2024-08-02 18:38:52 +07:00
28117047a2 Merge pull request #48 from ONLYOFFICE/fix/links
[bu] Fixed examples links
2024-07-28 23:17:22 -07:00
21bc4c4a78 [bu] Fixed examples links 2024-07-29 13:07:50 +07:00
d8149446fa Merge pull request #45 from ONLYOFFICE/fix/api-builder
[bu] Added links to examples
2024-07-26 03:21:34 -07:00
4e3a6d5fd0 [bu] Added links to examples 2024-07-26 17:12:13 +07:00
ed08a8154d Merge branch hotfix/v8.1.1 into release/v8.2.0 2024-07-26 08:09:56 +00:00
b7159ab013 Merge branch hotfix/v8.1.1 into develop 2024-07-26 08:09:54 +00:00
fed8a12cc8 [de] Fix issue with choice name for new radio buttons 2024-07-19 14:05:33 +03:00
e4b1254e7b Merge branch release/v8.1.0 into master 2024-06-19 08:26:44 +00:00
24fbc65a0f Merge remote-tracking branch 'remotes/origin/release/v8.1.0' into develop 2024-06-06 15:24:39 +03:00
847e9fdb73 For bug #63437
Fix an issue with updating image form properties when adding it
2024-05-14 18:11:32 +03:00
f5156538c1 [copyright] Update Copyright date 2024-04-23 19:09:31 +03:00
456057e3ae [de] Fix form creation forms due to the new locking check scheme 2024-04-05 00:50:22 +03:00
f28ed90880 [bu][de] Creating date form method. 2024-04-05 00:50:22 +03:00
4352c15da9 Merge branch hotfix/v8.0.1 into release/v8.1.0 2024-03-15 11:17:01 +00:00
139f675db2 Merge branch hotfix/v8.0.1 into develop 2024-03-15 11:16:59 +00:00
d47f414c3d Merge branch release/v8.0.0 into develop 2024-02-05 08:45:53 +00:00
aead383937 Merge branch release/v8.0.0 into master 2024-01-30 11:29:38 +00:00
4ce68a3c8d Merge branch hotfix/v7.5.1 into release/v7.6.0 2023-11-15 12:53:47 +00:00
f1fa43375c Merge branch hotfix/v7.5.1 into develop 2023-11-15 12:53:45 +00:00
253d708535 Merge branch release/v7.5.0 into develop 2023-10-25 10:29:04 +00:00
d16707c294 Merge branch release/v7.5.0 into master 2023-10-17 12:11:40 +00:00
14d902e747 Fix bug #64428
Fix the position of the inserted image form
2023-10-08 13:26:27 +03:00
df76c99f38 Merge branch hotfix/v7.4.1 into develop 2023-08-01 08:16:47 +00:00
a84ee00ec4 [de] Remove unnecessary code, since all logic has been moved to convert method 2023-07-19 17:23:56 +05:00
2b53655564 [de] Remove paddings by default for fixed forms 2023-07-19 15:00:43 +05:00
1970ce1d9b Merge branch release/v7.4.0 into master 2023-06-13 11:23:34 +00:00
e2b34b409b Merge remote-tracking branch 'remotes/origin/release/v7.4.0' into develop 2023-05-17 19:55:31 +05:00
5fa0d5013e Merge remote-tracking branch 'remotes/origin/hotfix/v7.3.3' into release/v7.4.0 2023-05-17 19:55:04 +05:00
b0659c485d Merge remote-tracking branch 'remotes/origin/release/v7.4.0' into develop 2023-05-17 19:37:14 +05:00
959046f872 Merge branch hotfix/v7.3.3 into develop 2023-05-15 06:49:25 +00:00
93f3d5c0c9 Fix bug #62455
Fix issue with minimization
2023-05-04 13:56:34 +03:00
390d472b51 Fix bug #62375
Fix positioning of the added fixed form
2023-05-02 16:30:03 +03:00
e8037d127e Merge pull request #37 from ONLYOFFICE/feature/spi-docs
Api documentation
2023-04-28 18:48:27 +05:00
25754f8445 updated api docs 2023-04-28 16:42:25 +03:00
03adca5bad [de] Fix specifying a default value for date time picker 2023-04-24 15:10:07 +05:00
6879b71ab1 Fix bug #62162
Select fixed form as the shape when adding it to the document
2023-04-19 16:26:53 +05:00
46411f2cb4 For bug #62024
Forbid to add fixed forms inside a shape
2023-04-19 02:52:49 +05:00
a6cb05bdf2 [de][bu] Fix export 2023-04-13 15:16:42 +05:00
e4d122a18e [bu][de] Implement a method for inserting form overt text 2023-04-12 16:05:53 +03:00
48362b45df [de] Remove unused parameter 2023-04-07 19:50:46 +05:00
0c2566bd79 Fix bug #61897
Fix wrong font face for added radio button
2023-04-06 18:40:56 +05:00
0b9b27b808 [de] Allow date-time form to be filled with SetFormValue method 2023-04-06 16:23:23 +05:00
7a75794385 [de] Send OnFocusObject on SetFormValue 2023-04-05 21:07:14 +05:00
070bccf724 [de] Add asc_GetFormValue to api 2023-04-05 20:08:54 +05:00
d6ee4c9c7f [de] Add method to api to change form value from interface 2023-03-30 17:28:59 +05:00
363d027d8e For bug #61802
Fix the problem with constants
2023-03-27 14:58:24 +05:00
9855c96dd0 [de] Handle adding complex form into subform of another complex form
In this case the cursor will be moved outside the main form
2023-03-16 19:58:38 +05:00
60865166aa [de] Forbid to insert fixed form into complex form 2023-03-16 19:52:55 +05:00
7c0311808c [de] Use special placeholders for forms 2023-03-16 18:55:17 +05:00
7f2797afac [de] Move cursor outside the complex form when adding another complex form 2023-03-16 16:02:52 +05:00
8a0aa0fdb4 Merge branch hotfix/v7.3.3 into master 2023-03-15 10:51:27 +00:00
6fec31b93c [de] Allow new form to be added when another form is currently selected
In this case, we simply move the cursor outside the form
2023-03-15 14:42:04 +05:00
a7a1412e69 [copyright] Update address in Copyright 2023-03-01 21:23:10 +03:00
8cc0eba409 [copyright] Update Copyright 2023-02-27 10:27:52 +03:00
b4073edd9a [oform] Fix problem with lock check when setting form value 2023-02-08 23:52:26 +05:00
c1c4959eb0 Merge remote-tracking branch 'remotes/origin/hotfix/v7.3.3' into develop 2023-02-08 16:48:12 +05:00
9180d8d1e6 Merge pull request #34 from ONLYOFFICE/feature/api-docs
Api docs
2023-02-07 17:05:25 +03:00
b49b8e56f0 fixed form methods descriptions 2023-02-07 16:54:30 +03:00
b205db2720 Merge branch release/v7.3.0 into develop 2023-02-02 13:35:35 +00:00
1c7cd19c47 For bug #60921
Update roles after applying collaboration changes
2023-02-01 00:34:30 +03:00
da20bb573a Fix bug #60922
Fix setting of settings for multiple fields at the same time
2023-02-01 00:34:30 +03:00
d8628c74c6 [oform] Add new base class for all format classes 2023-01-31 16:23:04 +03:00
0ae117891d Merge branch release/v7.3.0 into master 2023-01-31 08:01:17 +00:00
77cad58384 [oform] Fix field count in case of complex forms 2023-01-27 02:27:31 +05:00
a908a16e95 [oform] Add event to handle undo/redo 2023-01-19 19:59:29 +05:00
72139c5780 Fix bug #60651
Add translation for default role
2023-01-19 18:40:36 +05:00
366f847ba3 Fix bug #60326
Add ability to add date-time content control with form properties
2023-01-13 17:22:39 +03:00
6171e936a3 Hide oform context from public access 2023-01-12 19:04:17 +03:00
13dd617208 Fix bug #60321
Fix the problem with adding a fixed form inside the complex form
2023-01-11 22:20:56 +03:00
c1d9ee4b63 Merge remote-tracking branch 'remotes/origin/release/v7.3.0' into develop 2023-01-11 05:55:05 +03:00
3d5237c5ed [oform] New default color for the default role 2022-12-28 16:06:54 +03:00
f7e84e5912 [de] Add XmlReaderContext to xmlParserContext; Add oform opening from bin; For bug 60341 2022-12-28 00:32:59 +03:00
61d936dcbb Merge branch hotfix/v7.2.2 into release/v7.3.0 2022-12-27 13:48:32 +00:00
31fb7a7fa6 Merge branch hotfix/v7.2.2 into develop 2022-12-27 13:48:28 +00:00
11aca8000d [oform] Fix minor bugs with read from/save to xml 2022-12-25 15:06:38 +03:00
1c2bd5bd6e [oform] Implement writing of default user master to xml
Also fix writing to xml of duplicates in relationship table
2022-12-25 12:14:28 +03:00
22b94b07f8 [oform] Fix writing to xml a field master class 2022-12-23 19:50:04 +03:00
0384213a2d [oform] Fix writing oform xml package 2022-12-23 19:49:31 +03:00
dbd10ccedc [oform] Handle relative links writing to xml 2022-12-23 19:48:41 +03:00
b782a77389 [oform] Write users/userMasters/fieldMaster to zip package
Serialize all of these classes to xml if no other classes are related to them
2022-12-23 15:18:27 +03:00
ef13bff264 [oform] Fix zip archive on save 2022-12-23 13:50:35 +03:00
d223836a85 [oform] Write main part to xml 2022-12-23 13:49:57 +03:00
902e1f2373 [oform] Fix issue with minimization 2022-12-23 11:53:29 +03:00
0f7358f40d [oform] Fix test function for writing oform to xml 2022-12-23 10:54:36 +03:00
2f4100e62d [oform] Work on xml writer 2022-12-23 10:28:01 +03:00
50952a7b75 Merge remote-tracking branch 'remotes/origin/feature/oformRoles' into release/v7.3.0 2022-12-22 16:34:51 +03:00
923eed266f [oform] Implement reading all users,user masters, field masters 2022-12-22 14:18:11 +03:00
e412f3095d [oform] Implement reading a default user master 2022-12-22 03:10:38 +03:00
0720f6cce0 [oform] Remove unused files 2022-12-22 03:09:43 +03:00
245697c157 [oform] Implement reading from xml a field master 2022-12-21 22:54:52 +03:00
c8b1fe0448 [oform] Fix read from xml user master 2022-12-21 22:54:01 +03:00
87b2dc1d07 [oform] Implement read from xml cross references 2022-12-21 22:53:26 +03:00
01c1afc35e [oform] Fix read from xml field group 2022-12-21 22:52:30 +03:00
ac50783d02 [oform] Work on reading FieldGroup rels 2022-12-21 02:51:49 +03:00
ea7ea90201 [oform] Fix inheritance 2022-12-20 15:21:48 +03:00
8008816b09 [oform] Fix inheritance of oformXmlPackage from openXmlPackage 2022-12-20 13:30:02 +03:00
5cc816dc6c [oform] Add class XmlPackage 2022-12-20 10:43:54 +03:00
a4d2fbf6f7 [oform] Base methods to read/write main.xml 2022-12-14 20:53:33 +03:00
597d63d4ce [oform] Add base functions to read/write field group from/to xml 2022-12-14 18:43:05 +03:00
e1e6f6fba2 [oform] Remove deprecated function 2022-12-14 02:44:27 +03:00
c86bc764d4 [oform] Fix write/read color in userMaster 2022-12-14 02:41:47 +03:00
8dd0a66829 [oform] Work on read/write userMaster to xml 2022-12-13 19:01:12 +03:00
2f951ed20a [oform] Change file structure 2022-12-12 19:18:58 +03:00
9c11211893 [oform] Fix rendering of role color when deleting a role 2022-12-12 16:17:50 +03:00
82cd96f57e [oform] Fix change of a user color 2022-12-12 12:20:31 +03:00
791e840bec [oform] Add current user
Also add method to get the first user of the fieldMaster
2022-12-09 14:09:54 +03:00
c82887316b [oform] Fix roles update on the end of any action 2022-12-07 20:52:20 +03:00
abde4ac3f9 [oform] Move all corrections to the onEndAction event 2022-12-07 20:33:54 +03:00
f0ea4cfe24 [oform] Check for unused fields at the end of the action 2022-12-07 15:01:11 +03:00
0be878b888 [oform] Add a method to clear the list of users in the field master 2022-12-07 12:04:32 +03:00
c903b45178 [oform] Add correction of a field master array
Also, return the number of role fields that are used in the document
2022-12-07 11:08:56 +03:00
2994a431a1 [oform] Make fixed form float on creation 2022-12-01 20:37:06 +03:00
e73020600e [oform] Implement adding form-field in the fixed form 2022-12-01 20:20:14 +03:00
def429f8b4 [oform] Fixes 2022-12-01 16:57:38 +03:00
fcb0d9ba55 [oform] Add clone method for field master 2022-12-01 16:30:29 +03:00
f6c07aa139 [oform] Implement method to remove role
Also implement method to count the number of fields in field group
2022-11-30 15:56:26 +03:00
b2c1f43e3b [oform] Add empty method to get number of fields in role 2022-11-29 14:38:28 +03:00
f88a486b13 [oform] Add event about changing user master 2022-11-29 14:32:03 +03:00
89e2cb15f9 [oform] Add method to edit role 2022-11-29 12:18:08 +03:00
6cfc7ab50f [oform] Fix color management 2022-11-28 20:28:27 +03:00
81c7af9ee7 [oform] Add event about field group change 2022-11-28 19:32:12 +03:00
614ae67fb6 [oform] Add methods to change the order of roles 2022-11-28 18:27:08 +03:00
14bb7c4042 [oform] Fix weight when add a field group 2022-11-28 15:03:09 +03:00
a75c5124c0 [oform] Add an event when the list of roles is updated 2022-11-26 17:36:34 +03:00
59b19a200f [oform] Fix adding role 2022-11-24 19:48:47 +03:00
5a9821cc95 [oform] Add role.js to config 2022-11-24 19:22:25 +03:00
bee49e0d83 [oform] Add users to FieldGroup
Also implement first variant of adding role to oform and updating list of roles
2022-11-24 14:59:52 +03:00
6d21c5ab0b [oform] Working on roles 2022-11-23 17:36:46 +03:00
8633fc8826 [oform] Add class for roles
Also add blank functions for managing roles
2022-11-23 15:47:06 +03:00
80589a5077 [forms] Refactor 2022-11-23 10:44:56 +03:00
f602a1303d [oform] Add methods to set/get users/userMasters/fieldMasters 2022-11-22 19:05:34 +03:00
212e00fa1a [oform] Add color property to UserMaster 2022-11-22 15:48:41 +03:00
dae1b6f619 [oform] Fix previous commit 2022-11-22 14:22:39 +03:00
b62c32f513 [oform] Add main class oform 2022-11-22 14:22:24 +03:00
f34ccbe982 [oform] Add link to logic document 2022-11-22 12:14:29 +03:00
0141064554 [oform] Fix Document.Author change 2022-11-22 12:07:35 +03:00
a188b1b65d [oform] Add getters to document class 2022-11-22 02:35:13 +03:00
43a57dec6d [oform] Add classes to convert oform document to xml format 2022-11-21 21:54:34 +03:00
c2f4cc8a47 Merge branch hotfix/v7.2.1 into master 2022-10-20 13:10:22 +00:00
25 changed files with 4512 additions and 1051 deletions

370
api.js
View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
@ -12,7 +12,7 @@
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
@ -42,6 +42,8 @@ window["AscOForm"] = window.AscOForm = AscOForm;
if (!oLogicDocument)
return;
CheckCurrentSelection(oLogicDocument);
if (oPr && oFormPr)
{
if (oPr.GroupKey)
@ -59,6 +61,7 @@ window["AscOForm"] = window.AscOForm = AscOForm;
oPr.UncheckedFont = "Segoe UI Symbol";
}
var nCheckedSymbol = oPr && oPr.CheckedSymbol ? oPr.CheckedSymbol : Asc.c_oAscSdtCheckBoxDefaults.CheckedSymbol;
var nUncheckedSymbol = oPr && oPr.UncheckedSymbol ? oPr.UncheckedSymbol : Asc.c_oAscSdtCheckBoxDefaults.UncheckedSymbol;
var sCheckedFont = oPr && oPr.CheckedFont ? oPr.CheckedFont : Asc.c_oAscSdtCheckBoxDefaults.CheckedFont;
@ -77,18 +80,21 @@ window["AscOForm"] = window.AscOForm = AscOForm;
AscFonts.FontPickerByCharacter.getFontBySymbol(nUncheckedSymbol);
}
function private_ApplyPrToCheckBox(oCC)
function private_ApplyPrToCheckBox(oCC, checkBoxPr)
{
if (!oCC)
return;
if (oFormPr)
{
oCC.SetFormPr(oFormPr);
oCC.UpdatePlaceHolderTextPrForForm();
private_CheckFormKey(oCC, oLogicDocument);
private_ApplyFormPr(oCC, oFormPr, oLogicDocument);
if (oPr && oPr.GroupKey)
private_CheckRadioButtonChoice(oCC, oLogicDocument, oPr.GroupKey);
else
private_CheckFormKey(oCC, oLogicDocument);
}
if (oCommonPr)
oCC.SetContentControlPr(oCommonPr);
}
@ -116,13 +122,13 @@ window["AscOForm"] = window.AscOForm = AscOForm;
CheckType : AscCommon.changestype_Paragraph_Content
}))
{
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlCheckBox);
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlCheckBox, undefined, undefined, true);
oLogicDocument.RemoveSelection();
for (let nIndex = 0, nCount = arrSelectedParagraphs.length; nIndex < nCount; ++nIndex)
{
let oCC = arrSelectedParagraphs[nIndex].AddCheckBoxToStartPos(oPr);
private_ApplyPrToCheckBox(oCC);
private_ApplyPrToCheckBox(oCC, oPr);
}
oLogicDocument.LoadDocumentState(oState);
@ -140,10 +146,10 @@ window["AscOForm"] = window.AscOForm = AscOForm;
oLogicDocument.RemoveTextSelection();
if (!oLogicDocument.IsSelectionLocked(AscCommon.changestype_Paragraph_Content))
{
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlCheckBox);
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlCheckBox, undefined, undefined, true);
var oCC = oLogicDocument.AddContentControlCheckBox(oPr);
private_ApplyPrToCheckBox(oCC);
private_ApplyPrToCheckBox(oCC, oPr);
oLogicDocument.UpdateInterface();
oLogicDocument.Recalculate();
@ -165,27 +171,55 @@ window["AscOForm"] = window.AscOForm = AscOForm;
private_PerformAddCheckBox();
}
};
window['Asc']['asc_docs_api'].prototype['asc_AddContentControlPicture'] = window['Asc']['asc_docs_api'].prototype.asc_AddContentControlPicture = function(oFormPr, oCommonPr)
window['Asc']['asc_docs_api'].prototype['asc_AddContentControlPicture'] = window['Asc']['asc_docs_api'].prototype.asc_AddContentControlPicture = function(oFormPr, oCommonPr, isSignature)
{
var oLogicDocument = this.private_GetLogicDocument();
if (!oLogicDocument)
return;
CheckCurrentSelection(oLogicDocument);
oLogicDocument.RemoveTextSelection();
if (!oLogicDocument.IsSelectionLocked(AscCommon.changestype_Paragraph_Content))
{
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlPicture);
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlPicture, undefined, undefined, true);
var oCC = oLogicDocument.AddContentControlPicture();
// 150x32pt for Signature
let w = isSignature ? 150 / 72 * 25.4 : undefined;
let h = isSignature ? 32 / 72 * 25.4 : undefined;
var oCC = oLogicDocument.AddContentControlPicture(w, h);
// MSWord can't open files with anchored picture content controls (70332)
if (oCC && !oFormPr)
{
let allDrawings = oCC.GetAllDrawingObjects();
for (let i = 0; i < allDrawings.length; ++i)
{
allDrawings[i].MakeInline();
}
}
let oFormParaDrawing = null;
if (oCC && oFormPr)
{
oCC.SetFormPr(oFormPr);
oCC.UpdatePlaceHolderTextPrForForm();
let pictPr = new AscCommon.CSdtPictureFormPr();
if (isSignature)
{
pictPr.SetSignature(true);
let glossary = oLogicDocument.GetGlossaryDocument();
if (glossary)
oCC.SetPlaceholder(glossary.GetDefaultPlaceholderSignatureOformDocPartId());
}
oCC.SetPictureFormPr(pictPr);
private_CheckFormKey(oCC, oLogicDocument);
oLogicDocument.Recalculate(true);
oFormParaDrawing = oCC.ConvertFormToFixed();
oCC.SetPictureFormPr(new AscCommon.CSdtPictureFormPr());
var aDrawings = oCC.GetAllDrawingObjects();
for(var nDrawing = 0; nDrawing < aDrawings.length; ++nDrawing)
{
@ -237,6 +271,11 @@ window["AscOForm"] = window.AscOForm = AscOForm;
oLogicDocument.Recalculate(true);
oCC.UpdatePictureFormLayout();
}
else
{
oCC.ReplaceContentWithPlaceHolder();
oCC.ApplyPicturePr(true, w, h);
}
}
if (oCC && oCommonPr)
@ -255,11 +294,17 @@ window["AscOForm"] = window.AscOForm = AscOForm;
oLogicDocument.FinalizeAction();
}
};
window['Asc']['asc_docs_api'].prototype['asc_AddContentControlSignature'] = window['Asc']['asc_docs_api'].prototype.asc_AddContentControlSignature = function(oFormPr, oCommonPr)
{
return this.asc_AddContentControlPicture(oFormPr, oCommonPr, true);
};
window['Asc']['asc_docs_api'].prototype['asc_AddContentControlList'] = window['Asc']['asc_docs_api'].prototype.asc_AddContentControlList = function(isComboBox, oPr, oFormPr, oCommonPr)
{
var oLogicDocument = this.private_GetLogicDocument();
if (!oLogicDocument)
return;
CheckCurrentSelection(oLogicDocument);
oLogicDocument.RemoveTextSelection();
if (!oLogicDocument.IsSelectionLocked(AscCommon.changestype_Paragraph_Content))
@ -274,7 +319,7 @@ window["AscOForm"] = window.AscOForm = AscOForm;
if (oCC && oFormPr)
{
oCC.SetFormPr(oFormPr);
private_ApplyFormPr(oCC, oFormPr, oLogicDocument);
oCC.UpdatePlaceHolderTextPrForForm();
private_CheckFormKey(oCC, oLogicDocument);
}
@ -282,6 +327,7 @@ window["AscOForm"] = window.AscOForm = AscOForm;
if (oCC && oCommonPr)
oCC.SetContentControlPr(oCommonPr);
oLogicDocument.AddMacroData(AscDFH.historydescription_Document_AddContentControlList, {isComboBox : isComboBox});
oLogicDocument.Recalculate();
oLogicDocument.UpdateInterface();
oLogicDocument.UpdateSelection();
@ -293,15 +339,42 @@ window["AscOForm"] = window.AscOForm = AscOForm;
var oLogicDocument = this.private_GetLogicDocument();
if (!oLogicDocument)
return;
CheckCurrentSelection(oLogicDocument);
oLogicDocument.RemoveTextSelection();
if (!oLogicDocument.IsSelectionLocked(AscCommon.changestype_Paragraph_Content))
{
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlList);
var oCC = oLogicDocument.AddContentControlDatePicker(oPr, oCommonPr);
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlDatePicker, undefined, undefined, true);
let dateTimePr = null;
let formPr = null;
let ccPr = null;
// For now, keeping compatibility with the old format so settings can come in the old way (oPr, oCommonPr)
// but in the future we need to switch to the new contentPr variant (AscCommon.CContentControlPr)
if (oPr && (oPr instanceof AscCommon.CContentControlPr))
{
dateTimePr = oPr.DateTimePr;
ccPr = oPr;
formPr = oPr.FormPr;
}
else if (oPr && (oPr instanceof AscWord.CSdtDatePickerPr))
{
dateTimePr = oPr;
ccPr = oCommonPr ? oCommonPr : null;
}
var oCC = oLogicDocument.AddContentControlDatePicker(dateTimePr);
if (oCC && oCommonPr)
oCC.SetContentControlPr(oCommonPr);
if (oCC && ccPr)
oCC.SetContentControlPr(ccPr);
if (oCC && formPr)
{
private_ApplyFormPr(oCC, formPr, oLogicDocument);
private_CheckFormKey(oCC, oLogicDocument);
}
oLogicDocument.Recalculate();
oLogicDocument.UpdateInterface();
@ -314,6 +387,8 @@ window["AscOForm"] = window.AscOForm = AscOForm;
var oLogicDocument = this.private_GetLogicDocument();
if (!oLogicDocument)
return;
CheckCurrentSelection(oLogicDocument);
let textFormPr = contentControlPr ? contentControlPr.TextFormPr : null;
let formPr = contentControlPr ? contentControlPr.FormPr : null;
@ -331,7 +406,7 @@ window["AscOForm"] = window.AscOForm = AscOForm;
if (formPr)
{
oCC.SetFormPr(formPr);
private_ApplyFormPr(oCC, formPr, oLogicDocument);
oCC.UpdatePlaceHolderTextPrForForm();
private_CheckFormKey(oCC, oLogicDocument);
}
@ -347,6 +422,8 @@ window["AscOForm"] = window.AscOForm = AscOForm;
let logicDocument = this.private_GetLogicDocument();
if (!logicDocument)
return;
CheckCurrentSelection(logicDocument, true);
function AddComplexForm()
{
@ -388,8 +465,10 @@ window["AscOForm"] = window.AscOForm = AscOForm;
return null;
let mainForm = form.GetMainForm();
if (!mainForm || !mainForm.IsComplexForm() || mainForm.IsLabeledCheckBox())
return null;
return (mainForm.IsComplexForm() ? mainForm : null);
return mainForm;
};
window['Asc']['asc_docs_api'].prototype['asc_ConvertFormToJson'] = window['Asc']['asc_docs_api'].prototype.asc_ConvertFormToJson = function(form)
{
@ -405,6 +484,171 @@ window["AscOForm"] = window.AscOForm = AscOForm;
return AscWord.FormToJson(form);
};
window['Asc']['asc_docs_api'].prototype['asc_SetFormValue'] = window['Asc']['asc_docs_api'].prototype.asc_SetFormValue = function(value, formId)
{
let logicDocument = this.private_GetLogicDocument();
if (!logicDocument)
return;
let form = logicDocument.GetContentControl(formId);
if (!form || !form.IsForm())
return;
if (typeof(value) === "string")
{
let _t = this;
AscFonts.FontPickerByCharacter.checkText(value, this, function() {
_t.private_SetFormValue(form.GetId(), value);
});
}
else
{
this.private_SetFormValue(form.GetId(), value);
}
};
window['Asc']['asc_docs_api'].prototype['asc_GetFormValue'] = window['Asc']['asc_docs_api'].prototype.asc_GetFormValue = function(formId)
{
let logicDocument = this.private_GetLogicDocument();
if (!logicDocument)
return "";
let form = logicDocument.GetContentControl(formId);
if (!form || !form.IsForm())
return "";
if (form.IsPictureForm())
return "";
else if (form.IsCheckBox())
return form.IsCheckBoxChecked();
else if (form.IsPlaceHolder())
return "";
return form.GetInnerText();
};
window['Asc']['asc_docs_api'].prototype.private_SetFormValue = function(internalId, value)
{
let oLogicDocument = this.private_GetLogicDocument();
if (!AscCommon.g_oTableId
|| !oLogicDocument
|| !oLogicDocument.IsDocumentEditor())
return;
let oForm = AscCommon.g_oTableId.GetClass(internalId);
if (!oForm
|| !(oForm instanceof AscWord.CInlineLevelSdt)
|| !oForm.IsForm())
return;
// When checking lock inside a paragraph, we rely on the selection within that paragraph
// so we need to select the form
let state = oLogicDocument.SaveDocumentState();
oForm.SelectContentControl();
let oParagraph = oForm.GetParagraph();
oForm.SkipFillingFormModeCheck(true);
oForm.SkipSpecialContentControlLock(true);
if (!oParagraph
|| oLogicDocument.IsSelectionLocked(AscCommon.changestype_None, {
Type : AscCommon.changestype_2_ElementsArray_and_Type,
Elements : [oParagraph],
CheckType : AscCommon.changestype_Paragraph_Content
}, true, oLogicDocument.IsFillingFormMode()))
{
oLogicDocument.LoadDocumentState(state);
oForm.SkipFillingFormModeCheck(false);
oForm.SkipSpecialContentControlLock(false);
return;
}
oLogicDocument.LoadDocumentState(state);
oForm.SkipFillingFormModeCheck(false);
oForm.SkipSpecialContentControlLock(false);
oLogicDocument.StartAction(AscDFH.historydescription_Document_FillFormInPlugin);
let isClear = false;
if (null === value)
{
isClear = true;
}
else if (oForm.IsTextForm() || oForm.IsComboBox())
{
let sValue = AscBuilder.GetStringParameter(value, "");
if (!sValue)
isClear = true;
else
oForm.SetInnerText(sValue);
}
else if (oForm.IsDropDownList())
{
let sValue = AscBuilder.GetStringParameter(value, "");
let oPr = oForm.GetDropDownListPr();
let nIndex = oPr.FindByText(sValue);
if (-1 !== nIndex)
oForm.SelectListItem(oPr.GetItemValue(nIndex));
else
isClear = true;
}
else if (oForm.IsCheckBox())
{
let isChecked = value === "true" ? true : value === "false" ? false : AscBuilder.GetBoolParameter(value, null);
if (null !== isChecked)
oForm.SetCheckBoxChecked(isChecked);
else
isClear = true;
}
else if (oForm.IsPictureForm())
{
let sValue = AscBuilder.GetStringParameter(value, "");
if (!sValue)
return;
let oImg;
let allDrawings = oForm.GetAllDrawingObjects();
for (let nDrawing = 0; nDrawing < allDrawings.length; ++nDrawing)
{
if (allDrawings[nDrawing].IsPicture())
{
oImg = allDrawings[nDrawing].GraphicObj;
break;
}
}
if (oImg)
{
oForm.SetShowingPlcHdr(false);
oImg.setBlipFill(AscFormat.CreateBlipFillRasterImageId(sValue));
}
else
{
isClear = true;
}
}
else if (oForm.IsDatePicker())
{
let sValue = AscBuilder.GetStringParameter(value, "");
if (!sValue)
isClear = true;
else
oForm.SetInnerText(sValue);
// TODO: Need to try setting FullDate to the given value. Currently we always reset to the current date
let datePickerPr = oForm.GetDatePickerPr().Copy();
datePickerPr.SetFullDate(null);
oForm.SetDatePickerPr(datePickerPr);
}
if (isClear)
oForm.ClearContentControlExt();
oLogicDocument.OnChangeForm(oForm);
oLogicDocument.Recalculate();
oLogicDocument.UpdateTracks();
oLogicDocument.UpdateInterface();
oLogicDocument.FinalizeAction();
};
function private_CheckFormKey(form, logicDocument)
{
@ -426,5 +670,85 @@ window["AscOForm"] = window.AscOForm = AscOForm;
formPr.SetKey(key);
form.SetFormPr(formPr);
}
function private_CheckRadioButtonChoice(form, logicDocument, groupKey)
{
if (!form || !form.IsForm() || !logicDocument)
return;
let choice = form.GetFormKey();
if (choice && "" !== choice.trim())
return;
let formManager = logicDocument.GetFormsManager();
let keyGenerator = formManager.GetKeyGenerator();
form.SetFormRequired(formManager.IsRadioGroupRequired(groupKey));
let formPr = form.GetFormPr().Copy();
if (!formPr)
return;
choice = keyGenerator.GetNewChoiceByGroupKey(groupKey);
formPr.SetKey(choice);
form.SetFormPr(formPr);
}
function private_ApplyFormPr(form, formPr, logicDocument)
{
if (!form || !formPr)
return;
form.SetFormPr(formPr.Copy());
if (!form.IsMainForm() && form.GetMainForm().GetFormRole() !== formPr.GetRole())
form.SetFormRole(form.GetMainForm().GetFormRole());
let docPartId = form.GetPlaceholder();
let glossary = logicDocument.GetGlossaryDocument();
if ((form.IsTextForm()
|| form.IsDropDownList()
|| form.IsComboBox()
|| form.IsDatePicker())
&&
(docPartId === glossary.GetDefaultPlaceholderTextDocPartId()
|| docPartId === glossary.GetDefaultPlaceholderListDocPartId()
|| docPartId === glossary.GetDefaultPlaceholderDateTimeDocPartId()))
{
if (docPartId === glossary.GetDefaultPlaceholderTextDocPartId())
form.SetPlaceholder(glossary.GetDefaultPlaceholderTextOformDocPartId());
else if (docPartId === glossary.GetDefaultPlaceholderListDocPartId())
form.SetPlaceholder(glossary.GetDefaultPlaceholderListOformDocPartId());
else if (docPartId === glossary.GetDefaultPlaceholderDateTimeDocPartId())
form.SetPlaceholder(glossary.GetDefaultPlaceholderDateTimeOformDocPartId());
if (form.IsPlaceHolder())
form.private_FillPlaceholderContent();
}
let paragraph = form.GetParagraph();
if (form.IsMainForm() && formPr.GetFixed() && (!paragraph || !paragraph.GetParentShape()))
{
logicDocument.Recalculate(true);
let drawing = form.ConvertFormToFixed();
if (drawing)
drawing.SelectAsDrawing();
}
}
function CheckCurrentSelection(logicDocument, isComplex)
{
let form = logicDocument.GetContentControl();
let mainForm = form ? form.GetMainForm() : null;
if (mainForm && mainForm.IsLabeledCheckBox())
return mainForm.MoveCursorOutsideForm(false);
if (!form || !form.IsForm() || (form.IsComplexForm() && !isComplex))
return;
if (isComplex)
form = form.GetMainForm();
form.MoveCursorOutsideForm(false);
}
})(window, window.document);

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
@ -12,7 +12,7 @@
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
@ -38,10 +38,13 @@
// Import
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const AscBuilder = window["AscBuilder"];
const GetStringParameter = AscBuilder.GetStringParameter;
const GetBoolParameter = AscBuilder.GetBoolParameter;
const GetNumberParameter = AscBuilder.GetNumberParameter;
const GetArrayParameter = AscBuilder.GetArrayParameter;
const ApiDocument = AscBuilder.ApiDocument;
const GetStringParameter = AscBuilder.GetStringParameter;
const GetBoolParameter = AscBuilder.GetBoolParameter;
const GetNumberParameter = AscBuilder.GetNumberParameter;
const GetArrayParameter = AscBuilder.GetArrayParameter;
const executeNoFormLockCheck = AscBuilder.executeNoFormLockCheck;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
@ -50,45 +53,67 @@
* @class
* @name Api
*/
var Api = window["Asc"]["asc_docs_api"] || window["Asc"]["spreadsheet_api"];
var Api = AscBuilder.Word.Api;
/**
* Common form properties.
* @typedef {Object} FormPrBase
* @property {string} key - Form key.
* @property {string} tip - Form tip text.
* @property {string} key - The form key.
* @property {string} tip - The form tip text.
* @property {string} tag - The form tag.
* @property {string} role - The role to fill out form.
* @property {boolean} required - Specifies if the form is required or not.
* @property {string} placeholder - Form placeholder text.
* @property {string} placeholder - The form placeholder text.
* @see office-js-api/Examples/Enumerations/FormPrBase.js
*/
/**
* Specific text form properties.
* Specific text field properties.
* @typedef {Object} TextFormPrBase
* @property {boolean} comb - Specifies if the text form should be a comb of characters with the same cell width. The maximum number of characters must be set to a positive value.
* @property {number} maxCharacters - The maximum number of characters in the text form.
* @property {boolean} comb - Specifies if the text field should be a comb of characters with the same cell width. The maximum number of characters must be set to a positive value.
* @property {number} maxCharacters - The maximum number of characters in the text field.
* @property {number} cellWidth - The cell width for each character measured in millimeters. If this parameter is not specified or equal to 0 or less, then the width will be set automatically.
* @property {boolean} multiLine - Specifies if the current fixed size text form is multiline or not.
* @property {boolean} autoFit - Specifies if the text form content should be autofit, i.e. whether the font size adjusts to the size of the fixed size form.
* @property {boolean} multiLine - Specifies if the current fixed size text field is multiline or not.
* @property {boolean} autoFit - Specifies if the text field content should be autofit, i.e. whether the font size adjusts to the size of the fixed size form.
* @see office-js-api/Examples/Enumerations/TextFormPrBase.js
*/
/**
* Text form properties.
* Text field properties.
* @typedef {FormPrBase | TextFormPrBase} TextFormPr
* @see office-js-api/Examples/Enumerations/TextFormPr.js
*/
/**
* Form insertion specific properties.
* @typedef {Object} FormInsertPr
* @property {boolean} [placeholderFromSelection=false] - Specifies if the currently selected text should be saved as a placeholder of the inserted form.
* @property {boolean} [keepSelectedTextInForm=true] - Specifies if the currently selected text should be saved as the content of the inserted form.
* @see office-js-api/Examples/Enumerations/FormInsertPr.js
*/
/**
* Properties for inserting a text field.
* @typedef {FormPrBase | TextFormPrBase | FormInsertPr} TextFormInsertPr
* @see office-js-api/Examples/Enumerations/TextFormInsertPr.js
*/
/**
* Specific checkbox properties.
* Specific checkbox / radio button properties.
* @typedef {Object} CheckBoxFormPrBase
* @property {boolean} radio - Specifies if the current checkbox is a radio button. In this case, the key parameter is considered as an identifier for the group of radio buttons.
* @see office-js-api/Examples/Enumerations/CheckBoxFormPrBase.js
*/
/**
* Checkbox form properties.
* Checkbox / radio button properties.
* @typedef {FormPrBase | CheckBoxFormPrBase} CheckBoxFormPr
* @see office-js-api/Examples/Enumerations/CheckBoxFormPr.js
*/
/**
* Specific combo box properties.
* Specific combo box / dropdown list properties.
* @typedef {Object} ComboBoxFormPrBase
* @property {boolean} editable - Specifies if the combo box text can be edited.
* @property {boolean} autoFit - Specifies if the combo box form content should be autofit, i.e. whether the font size adjusts to the size of the fixed size form.
@ -97,21 +122,25 @@
     * If the array consists of single strings, then the displayed value and its meaning are the same.
     * Example: ["First", ["Second", "2"], ["Third", "3"], "Fourth"].
* @see office-js-api/Examples/Enumerations/ComboBoxFormPrBase.js
*/
/**
* Combo box form properties.
* Combo box / dropdown list properties.
* @typedef {FormPrBase | ComboBoxFormPrBase} ComboBoxFormPr
* @see office-js-api/Examples/Enumerations/ComboBoxFormPr.js
*/
/**
* The condition to scale an image in the picture form.
* @typedef {"always" | "never" | "tooBig" | "tooSmall"} ScaleFlag
* @see office-js-api/Examples/Enumerations/ScaleFlag.js
*/
/**
* Value from 0 to 100.
* @typedef {number} percentage
* @see office-js-api/Examples/Enumerations/percentage.js
*/
/**
@ -121,244 +150,607 @@
* @property {boolean} lockAspectRatio - Specifies if the aspect ratio of the picture form is locked or not.
* @property {boolean} respectBorders - Specifies if the form border width is respected or not when scaling the image.
* @property {percentage} shiftX - Horizontal picture position inside the picture form measured in percent:
* * <b>0</b> - the picture is placed on the left;
* * <b>50</b> - the picture is placed in the center;
* * <b>100</b> - the picture is placed on the right.
* <b>0</b> - the picture is placed on the left;
* <b>50</b> - the picture is placed in the center;
* <b>100</b> - the picture is placed on the right.
* @property {percentage} shiftY - Vertical picture position inside the picture form measured in percent:
* * <b>0</b> - the picture is placed on top;
* * <b>50</b> - the picture is placed in the center;
* * <b>100</b> - the picture is placed on the bottom.
* <b>0</b> - the picture is placed on top;
* <b>50</b> - the picture is placed in the center;
* <b>100</b> - the picture is placed on the bottom.
* @see office-js-api/Examples/Enumerations/PictureFormPrBase.js
*/
/**
* Picture form properties.
* @typedef {FormPrBase | PictureFormPrBase} PictureFormPr
* @see office-js-api/Examples/Enumerations/PictureFormPr.js
*/
/**
* Creates a text form with the specified text form properties.
* Specific date form properties.
* @typedef {Object} DateFormPrBase
* @property {string} format - The date format, ex: mm.dd.yyyy
* @property {string} lang - The date language. Possible value for this parameter is a language identifier as defined by
* RFC 4646/BCP 47. Example: "en-CA".
* @see office-js-api/Examples/Enumerations/DateFormPrBase.js
*/
/**
* Date form properties.
* @typedef {FormPrBase | DateFormPrBase} DateFormPr
* @see office-js-api/Examples/Enumerations/DateFormPr.js
*/
/**
* Creates a text field with the specified text field properties.
* @memberof Api
* @param {TextFormPr} oFormPr - Text form properties.
* @typeofeditors ["CDE", "CFE"]
* @param {TextFormPr} formPr - Text field properties.
* @returns {ApiTextForm}
* @see office-js-api/Examples/Forms/Api/Methods/CreateTextForm.js
*/
Api.prototype.CreateTextForm = function(oFormPr)
Api.CreateTextForm = function(formPr)
{
if (!oFormPr)
oFormPr = {};
let oCC = CreateCommonForm(oFormPr);
let oPr = new AscCommon.CSdtTextFormPr();
oPr.SetComb(GetBoolParameter(oFormPr["comb"], false));
oPr.SetMaxCharacters(GetNumberParameter(oFormPr["maxCharacters"], -1));
oPr.SetMultiLine(GetBoolParameter(oFormPr["multiLine"], false));
oPr.SetAutoFit(GetBoolParameter(oFormPr["autoFit"], false));
oPr.SetWidth((GetNumberParameter(oFormPr["cellWidth"], 0) * 72 * 20 / 25.4) | 0);
oCC.ApplyTextFormPr(oPr);
CheckFormKey(oCC);
return new AscBuilder.ApiTextForm(oCC);
return executeNoFormLockCheck(function()
{
if (!formPr)
formPr = {};
let form = CreateCommonForm(formPr);
ApplyTextFormPr(form, formPr);
CheckForm(form);
return new AscBuilder.ApiTextForm(form);
}, this);
};
/**
* Creates a checkbox/radio button form with the specified checkbox/radio button form properties.
* Creates a checkbox / radio button with the specified checkbox / radio button properties.
* @memberof Api
* @param {CheckBoxFormPr} oFormPr - Checkbox/radio button form properties.
* @typeofeditors ["CDE", "CFE"]
* @param {CheckBoxFormPr} formPr - Checkbox / radio button properties.
* @returns {ApiCheckBoxForm}
* @see office-js-api/Examples/Forms/Api/Methods/CreateCheckBoxForm.js
*/
Api.prototype.CreateCheckBoxForm = function(oFormPr)
Api.CreateCheckBoxForm = function(formPr)
{
if (!oFormPr)
oFormPr = {};
oFormPr["placeholder"] = undefined;
var oCC;
var oCheckboxPr = new AscCommon.CSdtCheckBoxPr();
if (GetBoolParameter(oFormPr["radio"], false))
return executeNoFormLockCheck(function()
{
oCheckboxPr.CheckedSymbol = 0x25C9;
oCheckboxPr.UncheckedSymbol = 0x25CB;
oCheckboxPr.GroupKey = GetStringParameter(oFormPr["key"], "Group1");
}
else
{
oCheckboxPr.CheckedSymbol = 0x2611;
oCheckboxPr.UncheckedSymbol = 0x2610;
}
oCheckboxPr.CheckedFont = "Segoe UI Symbol";
oCheckboxPr.UncheckedFont = "Segoe UI Symbol";
var nCheckedSymbol = oCheckboxPr && oCheckboxPr.CheckedSymbol ? oCheckboxPr.CheckedSymbol : Asc.c_oAscSdtCheckBoxDefaults.CheckedSymbol;
var nUncheckedSymbol = oCheckboxPr && oCheckboxPr.UncheckedSymbol ? oCheckboxPr.UncheckedSymbol : Asc.c_oAscSdtCheckBoxDefaults.UncheckedSymbol;
var sCheckedFont = oCheckboxPr && oCheckboxPr.CheckedFont ? oCheckboxPr.CheckedFont : Asc.c_oAscSdtCheckBoxDefaults.CheckedFont;
var sUncheckedFont = oCheckboxPr && oCheckboxPr.UncheckedFont ? oCheckboxPr && oCheckboxPr.UncheckedFont : Asc.c_oAscSdtCheckBoxDefaults.UncheckedFont;
var isLoadFonts = false;
if (!AscCommon.IsAscFontSupport(sCheckedFont, nCheckedSymbol))
{
isLoadFonts = true;
AscFonts.FontPickerByCharacter.getFontBySymbol(nCheckedSymbol);
}
if (!AscCommon.IsAscFontSupport(sUncheckedFont, nUncheckedSymbol))
{
isLoadFonts = true;
AscFonts.FontPickerByCharacter.getFontBySymbol(nUncheckedSymbol);
}
function private_PerformAddCheckBox()
{
oCC = CreateCommonForm(oFormPr);
oCC.ApplyCheckBoxPr(oCheckboxPr);
}
if (isLoadFonts)
{
var oFonts = {};
oFonts[sCheckedFont] = true;
oFonts[sUncheckedFont] = true;
AscCommon.Check_LoadingDataBeforePrepaste(this, oFonts, {}, private_PerformAddCheckBox);
}
else
{
private_PerformAddCheckBox();
}
CheckFormKey(oCC);
return new AscBuilder.ApiCheckBoxForm(oCC);
if (!formPr)
formPr = {};
formPr["placeholder"] = undefined;
var oCC;
var oCheckboxPr = new AscCommon.CSdtCheckBoxPr();
if (GetBoolParameter(formPr["radio"], false))
{
oCheckboxPr.CheckedSymbol = 0x25C9;
oCheckboxPr.UncheckedSymbol = 0x25CB;
oCheckboxPr.GroupKey = GetStringParameter(formPr["key"], "Group1");
}
else
{
oCheckboxPr.CheckedSymbol = 0x2611;
oCheckboxPr.UncheckedSymbol = 0x2610;
}
oCheckboxPr.CheckedFont = "Segoe UI Symbol";
oCheckboxPr.UncheckedFont = "Segoe UI Symbol";
var nCheckedSymbol = oCheckboxPr && oCheckboxPr.CheckedSymbol ? oCheckboxPr.CheckedSymbol : Asc.c_oAscSdtCheckBoxDefaults.CheckedSymbol;
var nUncheckedSymbol = oCheckboxPr && oCheckboxPr.UncheckedSymbol ? oCheckboxPr.UncheckedSymbol : Asc.c_oAscSdtCheckBoxDefaults.UncheckedSymbol;
var sCheckedFont = oCheckboxPr && oCheckboxPr.CheckedFont ? oCheckboxPr.CheckedFont : Asc.c_oAscSdtCheckBoxDefaults.CheckedFont;
var sUncheckedFont = oCheckboxPr && oCheckboxPr.UncheckedFont ? oCheckboxPr && oCheckboxPr.UncheckedFont : Asc.c_oAscSdtCheckBoxDefaults.UncheckedFont;
var isLoadFonts = false;
if (!AscCommon.IsAscFontSupport(sCheckedFont, nCheckedSymbol))
{
isLoadFonts = true;
AscFonts.FontPickerByCharacter.getFontBySymbol(nCheckedSymbol);
}
if (!AscCommon.IsAscFontSupport(sUncheckedFont, nUncheckedSymbol))
{
isLoadFonts = true;
AscFonts.FontPickerByCharacter.getFontBySymbol(nUncheckedSymbol);
}
function private_PerformAddCheckBox()
{
oCC = CreateCommonForm(formPr);
oCC.ApplyCheckBoxPr(oCheckboxPr);
}
if (isLoadFonts)
{
var oFonts = {};
oFonts[sCheckedFont] = true;
oFonts[sUncheckedFont] = true;
AscCommon.Check_LoadingDataBeforePrepaste(this, oFonts, {}, private_PerformAddCheckBox);
}
else
{
private_PerformAddCheckBox();
}
CheckForm(oCC);
return new AscBuilder.ApiCheckBoxForm(oCC);
}, this);
};
/**
* Creates a combo box/dropdown form with the specified combo box/dropdown form properties.
* Creates a combo box / dropdown list with the specified combo box / dropdown list properties.
* @memberof Api
* @param {ComboBoxFormPr} oFormPr - Combo box/dropdown form properties.
* @typeofeditors ["CDE", "CFE"]
* @param {ComboBoxFormPr} formPr - Combo box / dropdown list properties.
* @returns {ApiComboBoxForm}
* @see office-js-api/Examples/Forms/Api/Methods/CreateComboBoxForm.js
*/
Api.prototype.CreateComboBoxForm = function(oFormPr)
Api.CreateComboBoxForm = function(formPr)
{
if (!oFormPr)
oFormPr = {};
var oPr = new AscCommon.CSdtComboBoxPr();
oPr.AddItem(AscCommon.translateManager.getValue("Choose an item"), "");
var oCC = CreateCommonForm(oFormPr);
let sPlaceholder = GetStringParameter(oFormPr["placeholder"], undefined);
let arrList = GetArrayParameter(oFormPr["items"], []);
for (let nIndex = 0, nCount = arrList.length; nIndex < nCount; ++nIndex)
return executeNoFormLockCheck(function()
{
let oItem = arrList[nIndex];
if (GetStringParameter(oItem, null))
if (!formPr)
formPr = {};
var oPr = new AscCommon.CSdtComboBoxPr();
oPr.AddItem(AscCommon.translateManager.getValue("Choose an item"), "");
var oCC = CreateCommonForm(formPr);
let sPlaceholder = GetStringParameter(formPr["placeholder"], undefined);
let arrList = GetArrayParameter(formPr["items"], []);
for (let nIndex = 0, nCount = arrList.length; nIndex < nCount; ++nIndex)
{
oPr.AddItem(oItem, oItem);
let oItem = arrList[nIndex];
if (GetStringParameter(oItem, null))
{
oPr.AddItem(oItem, oItem);
}
else if (GetArrayParameter(oItem, null))
{
let sDisplay = GetStringParameter(oItem[0], null);
let sValue = GetStringParameter(oItem[1], null);
if (null !== sDisplay && null !== sValue)
oPr.AddItem(sDisplay, sValue);
}
}
else if (GetArrayParameter(oItem, null))
oPr.SetAutoFit(GetBoolParameter(formPr["autoFit"], false));
if (!GetBoolParameter(formPr["editable"], false))
{
let sDisplay = GetStringParameter(oItem[0], null);
let sValue = GetStringParameter(oItem[1], null);
if (null !== sDisplay && null !== sValue)
oPr.AddItem(sDisplay, sValue);
}
}
oPr.SetAutoFit(GetBoolParameter(oFormPr["autoFit"], false));
if (!GetBoolParameter(oFormPr["editable"], false))
{
if (sPlaceholder)
{
oCC.ApplyDropDownListPr(oPr);
if (sPlaceholder)
{
oCC.ApplyDropDownListPr(oPr);
}
else
{
oCC.SetDropDownListPr(oPr);
oCC.SelectListItem();
}
}
else
{
oCC.SetDropDownListPr(oPr);
oCC.SelectListItem();
if (sPlaceholder)
{
oCC.ApplyComboBoxPr(oPr);
}
else
{
oCC.SetComboBoxPr(oPr);
oCC.SelectListItem();
}
}
}
else
{
if (sPlaceholder)
{
oCC.ApplyComboBoxPr(oPr);
}
else
{
oCC.SetComboBoxPr(oPr);
oCC.SelectListItem();
}
}
CheckFormKey(oCC);
return new AscBuilder.ApiComboBoxForm(oCC);
CheckForm(oCC);
return new AscBuilder.ApiComboBoxForm(oCC);
}, this);
};
/**
* Creates a picture form with the specified picture form properties.
* @memberof Api
* @param {PictureFormPr} oFormPr - Picture form properties.
* @typeofeditors ["CDE", "CFE"]
* @param {PictureFormPr} formPr - Picture form properties.
* @returns {ApiPictureForm}
* @see office-js-api/Examples/Forms/Api/Methods/CreatePictureForm.js
*/
Api.prototype.CreatePictureForm = function(oFormPr)
Api.CreatePictureForm = function(formPr)
{
if (!oFormPr)
oFormPr = {};
if (GetStringParameter("placeholder", null))
oFormPr["placeholder"] = AscCommon.translateManager.getValue("Click to load image");
var oCC = CreateCommonForm(oFormPr);
oCC.ApplyPicturePr(true);
oCC.ConvertFormToFixed();
let oPr = new AscCommon.CSdtPictureFormPr();
let sScale = GetStringParameter(oFormPr["scaleFlag"], undefined);
switch (sScale)
return executeNoFormLockCheck(function()
{
case "always": oPr.SetScaleFlag(Asc.c_oAscPictureFormScaleFlag.Always); break;
case "never": oPr.SetScaleFlag(Asc.c_oAscPictureFormScaleFlag.Never); break;
case "tooBig": oPr.SetScaleFlag(Asc.c_oAscPictureFormScaleFlag.Bigger); break;
case "tooSmall": oPr.SetScaleFlag(Asc.c_oAscPictureFormScaleFlag.Smaller); break;
if (!formPr)
formPr = {};
if (GetStringParameter("placeholder", null))
formPr["placeholder"] = AscCommon.translateManager.getValue("Click to load image");
var oCC = CreateCommonForm(formPr);
oCC.ApplyPicturePr(true);
oCC.ConvertFormToFixed();
let oPr = new AscCommon.CSdtPictureFormPr();
let sScale = GetStringParameter(formPr["scaleFlag"], undefined);
switch (sScale)
{
case "always":
oPr.SetScaleFlag(Asc.c_oAscPictureFormScaleFlag.Always);
break;
case "never":
oPr.SetScaleFlag(Asc.c_oAscPictureFormScaleFlag.Never);
break;
case "tooBig":
oPr.SetScaleFlag(Asc.c_oAscPictureFormScaleFlag.Bigger);
break;
case "tooSmall":
oPr.SetScaleFlag(Asc.c_oAscPictureFormScaleFlag.Smaller);
break;
}
oPr.SetConstantProportions(GetBoolParameter(formPr["lockAspectRatio"], true));
oPr.SetRespectBorders(GetBoolParameter(formPr["respectBorders"], false));
oPr.SetShiftX(Math.max(0, Math.min(100, GetNumberParameter(formPr["shiftX"], 50))) / 100);
oPr.SetShiftY(Math.max(0, Math.min(100, GetNumberParameter(formPr["shiftY"], 50))) / 100);
oCC.SetPictureFormPr(oPr);
CheckForm(oCC);
return new AscBuilder.ApiPictureForm(oCC);
}, this);
};
/**
* Creates a date form with the specified date form properties.
* @memberof Api
* @typeofeditors ["CDE", "CFE"]
* @param {DateFormPr} formPr - Date form properties.
* @returns {ApiDateForm}
* @see office-js-api/Examples/Forms/Api/Methods/CreateDateForm.js
*/
Api.CreateDateForm = function(formPr)
{
return executeNoFormLockCheck(function()
{
if (!formPr)
formPr = {};
let form = CreateCommonForm(formPr);
ApplyDateFormPr(form, formPr);
CheckForm(form);
return new AscBuilder.ApiDateForm(form);
}, this);
};
/**
* Creates a complex form with the specified complex form properties.
* @memberof Api
* @typeofeditors ["CDE", "CFE"]
* @param {FormPrBase} formPr - Complex form properties.
* @returns {ApiComplexForm}
* @see office-js-api/Examples/Forms/Api/Methods/CreateComplexForm.js
*/
Api.CreateComplexForm = function(formPr)
{
return executeNoFormLockCheck(function()
{
if (!formPr)
formPr = {};
let form = CreateCommonForm(formPr);
ApplyComplexFormPr(form);
CheckForm(form);
return new AscBuilder.ApiComplexForm(form);
}, this);
};
/**
* Inserts a text box with the specified text box properties over the selected text.
* @memberof ApiDocument
* @typeofeditors ["CDE", "CFE"]
* @param {TextFormInsertPr} formPr - Properties for inserting a text field.
* @returns {ApiTextForm}
* @see office-js-api/Examples/Forms/ApiDocument/Methods/InsertTextForm.js
*/
ApiDocument.prototype.InsertTextForm = function(formPr)
{
return executeNoFormLockCheck(function()
{
if (!formPr)
formPr = {};
let logicDocument = this.Document;
let placeholder = GetStringParameter(formPr["placeholder"], undefined);
if (GetBoolParameter(formPr["placeholderFromSelection"], false))
placeholder = logicDocument.GetSelectedText();
if (!GetBoolParameter(formPr["keepSelectedTextInForm"], true))
logicDocument.RemoveBeforePaste();
let contentControl = logicDocument.AddContentControl(c_oAscSdtLevelType.Inline);
if (!contentControl)
return null;
ApplyCommonFormPr(contentControl, formPr);
SetFormPlaceholder(contentControl, placeholder);
ApplyTextFormPr(contentControl, formPr, true);
CheckForm(contentControl);
return new AscBuilder.ApiTextForm(contentControl);
}, this);
};
/**
* Class representing a collection of form roles.
* @constructor
* @since 9.0.0
* @typeofeditors ["CDE", "CFE"]
*/
function ApiFormRoles(oform)
{
this.oform = oform;
}
/**
* The date form properties.
* @typedef {FormPrBase | DateFormPrBase} DateFormPr
* @see office-js-api/Examples/Enumerations/DateFormPr.js
*/
/**
* The role properties.
* @typedef {Object} RoleProperties
* @property {string} color - The role color.
* @see office-js-api/Examples/Enumerations/RoleProperties.js
*/
/**
* Returns a collection of form roles.
* @since 9.0.0
* @typeofeditors ["CDE", "CFE"]
* @returns {ApiFormRoles}
* @see office-js-api/Examples/Forms/ApiDocument/Methods/GetFormRoles.js
*/
ApiDocument.prototype.GetFormRoles = function()
{
return new ApiFormRoles(this.Document.GetOFormDocument());
};
/**
* Adds a new form role.
* @memberof ApiFormRoles
* @since 9.0.0
* @typeofeditors ["CDE", "CFE"]
* @param {string} name - The name of role being added.
* @param {RoleProperties} props - The role properties.
* @returns {boolean}
* @see office-js-api/Examples/Forms/ApiFormRoles/Methods/Add.js
*/
ApiFormRoles.prototype.Add = function(name, props)
{
if (!this.oform || !name || this.oform.getRole(name))
return false;
let rgba = ParseRoleColor(props && props["color"] ? props["color"] : null);
let rolePr = new AscOForm.CRoleSettings();
rolePr.Name = name;
rolePr.Color = AscCommon.CreateAscColorCustom(rgba.R, rgba.G, rgba.B);
this.oform.addRole(rolePr);
return true;
};
/**
* Removes a role with the specified name.
* @memberof ApiFormRoles
* @since 9.0.0
* @typeofeditors ["CDE", "CFE"]
* @param {string} name - The name of role to be removed.
* @param {string} [delegateRole] - The name of the role to which all forms bound to this role will be delegated.
* @returns {boolean}
* @see office-js-api/Examples/Forms/ApiFormRoles/Methods/Remove.js
*/
ApiFormRoles.prototype.Remove = function(name, delegateRole)
{
if (!this.oform)
return false;
return this.oform.removeRole(name, delegateRole);
};
/**
* Returns a number of form roles.
* @memberof ApiFormRoles
* @since 9.0.0
* @typeofeditors ["CDE", "CFE"]
* @returns {number}
* @see office-js-api/Examples/Forms/ApiFormRoles/Methods/GetCount.js
*/
ApiFormRoles.prototype.GetCount = function()
{
if (!this.oform)
return 0;
return this.oform.getAllRoles().length;
};
/**
* Lists all available roles.
* @memberof ApiFormRoles
* @since 9.0.0
* @typeofeditors ["CDE", "CFE"]
* @returns {string[]}
* @see office-js-api/Examples/Forms/ApiFormRoles/Methods/GetAllRoles.js
*/
ApiFormRoles.prototype.GetAllRoles = function()
{
if (!this.oform)
return [];
let roles = this.oform.getAllRoles();
let result = [];
for (let i = 0; i < roles.length; ++i)
{
result.push(roles[i].getRole());
}
oPr.SetConstantProportions(GetBoolParameter(oFormPr["lockAspectRatio"], true));
oPr.SetRespectBorders(GetBoolParameter(oFormPr["respectBorders"], false));
oPr.SetShiftX(Math.max(0, Math.min(100, GetNumberParameter(oFormPr["shiftX"], 50))) / 100);
oPr.SetShiftY(Math.max(0, Math.min(100, GetNumberParameter(oFormPr["shiftY"], 50))) / 100);
oCC.SetPictureFormPr(oPr);
CheckFormKey(oCC);
return new AscBuilder.ApiPictureForm(oCC);
return result;
};
/**
* Checks if a role with the specified name exists.
* @memberof ApiFormRoles
* @since 9.0.0
* @typeofeditors ["CDE", "CFE"]
* @param {string} name - The role name.
* @returns {boolean}
* @see office-js-api/Examples/Forms/ApiFormRoles/Methods/HaveRole.js
*/
ApiFormRoles.prototype.HaveRole = function(name)
{
return this.oform && this.oform.haveRole(name);
};
/**
* Returns the RGB color of the specified role.
* @memberof ApiFormRoles
* @since 9.0.0
* @typeofeditors ["CDE", "CFE"]
* @param {string} name - The role name.
* @returns {null | {r:byte, g:byte, b:byte}}
* @see office-js-api/Examples/Forms/ApiFormRoles/Methods/GetRoleColor.js
*/
ApiFormRoles.prototype.GetRoleColor = function(name)
{
if (!this.oform || !this.oform.haveRole(name))
return null;
let color = this.oform.getRoleSettings(name).getColor();
if (!color)
return null;
return {
"r" : color.r,
"g" : color.g,
"b" : color.b
};
};
/**
* Sets the color for the specified role.
* @memberof ApiFormRoles
* @since 9.0.0
* @typeofeditors ["CDE", "CFE"]
* @param {string} name - The role name.
* @param {string} color - The role color.
* @returns {boolean}
* @see office-js-api/Examples/Forms/ApiFormRoles/Methods/SetRoleColor.js
*/
ApiFormRoles.prototype.SetRoleColor = function(name, color)
{
if (!this.oform || !this.oform.haveRole(name))
return false;
let rgba = ParseRoleColor(color);
let rolePr = new AscOForm.CRoleSettings();
rolePr.Name = name;
rolePr.Color = AscCommon.CreateAscColorCustom(rgba.R, rgba.G, rgba.B);
this.oform.editRole(name, rolePr);
return true;
};
/**
* Moves a role up in filling order.
* @memberof ApiFormRoles
* @since 9.0.0
* @typeofeditors ["CDE", "CFE"]
* @param {string} name - The role name.
* @returns {boolean}
* @see office-js-api/Examples/Forms/ApiFormRoles/Methods/MoveUp.js
*/
ApiFormRoles.prototype.MoveUp = function(name)
{
if (!this.oform)
return false;
return this.oform.moveUpRole(name);
};
/**
* Moves a role down in filling order.
* @memberof ApiFormRoles
* @since 9.0.0
* @typeofeditors ["CDE", "CFE"]
* @param {string} name - The role name.
* @returns {boolean}
* @see office-js-api/Examples/Forms/ApiFormRoles/Methods/MoveDown.js
*/
ApiFormRoles.prototype.MoveDown = function(name)
{
if (!this.oform)
return false;
return this.oform.moveDownRole(name);
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Private area
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function CreateCommonForm(oFormPr)
function CreateCommonForm(formPr)
{
if (!oFormPr)
oFormPr = {};
let contentControl = new AscCommonWord.CInlineLevelSdt();
var oTempFormPr = new AscCommon.CSdtFormPr();
oTempFormPr.SetHelpText(GetStringParameter(oFormPr["tip"], undefined));
oTempFormPr.SetRequired(GetBoolParameter(oFormPr["required"], false));
oTempFormPr.SetKey(GetStringParameter(oFormPr["key"], undefined));
var oCC = new AscCommonWord.CInlineLevelSdt();
let sPlaceHolder = GetStringParameter(oFormPr["placeholder"], undefined);
if (sPlaceHolder)
oCC.SetPlaceholderText(sPlaceHolder);
ApplyCommonFormPr(contentControl, formPr);
let placeholder = formPr ? GetStringParameter(formPr["placeholder"], undefined) : undefined;
SetFormPlaceholder(contentControl, placeholder);
let tag = formPr ? GetStringParameter(formPr["tag"], undefined) : undefined;
if (tag)
contentControl.SetTag(tag);
contentControl.ReplaceContentWithPlaceHolder(false);
contentControl.UpdatePlaceHolderTextPrForForm();
return contentControl;
}
function SetFormPlaceholder(form, text)
{
if (text)
form.SetPlaceholderText(text);
else
oCC.SetPlaceholder(c_oAscDefaultPlaceholderName.Text);
form.SetPlaceholder(c_oAscDefaultPlaceholderName.Text);
}
function ApplyCommonFormPr(form, formPr)
{
if (!formPr)
formPr = {};
let sdtFormPr = new AscCommon.CSdtFormPr();
sdtFormPr.SetHelpText(GetStringParameter(formPr["tip"], undefined));
sdtFormPr.SetRequired(GetBoolParameter(formPr["required"], false));
sdtFormPr.SetKey(GetStringParameter(formPr["key"], undefined));
sdtFormPr.SetRole(GetStringParameter(formPr["role"], undefined));
form.SetFormPr(sdtFormPr);
}
function ApplyTextFormPr(form, formPr, keepContent)
{
let textFormPr = new AscCommon.CSdtTextFormPr();
textFormPr.SetComb(GetBoolParameter(formPr["comb"], false));
textFormPr.SetMaxCharacters(GetNumberParameter(formPr["maxCharacters"], -1));
textFormPr.SetMultiLine(GetBoolParameter(formPr["multiLine"], false));
textFormPr.SetAutoFit(GetBoolParameter(formPr["autoFit"], false));
textFormPr.SetWidth((GetNumberParameter(formPr["cellWidth"], 0) * 72 * 20 / 25.4) | 0);
form.ApplyTextFormPr(textFormPr, keepContent);
}
function ApplyDateFormPr(form, formPr)
{
let datePickerPr = new AscCommon.CSdtDatePickerPr();
oCC.ReplaceContentWithPlaceHolder(false);
oCC.SetFormPr(oTempFormPr);
oCC.UpdatePlaceHolderTextPrForForm();
var nLcid = Asc.g_oLcidNameToIdMap[formPr["lang"]];
if (undefined == nLcid)
nLcid = 1033;
return oCC;
datePickerPr.SetDateFormat(GetStringParameter(formPr["format"], "mm/dd/yyyy"));
datePickerPr.SetLangId(nLcid);
form.ApplyDatePickerPr(datePickerPr);
}
function ApplyComplexFormPr(form)
{
let complexFormPr = new AscWord.CSdtComplexFormPr();
form.SetComplexFormPr(complexFormPr);
}
function CheckForm(form)
{
CheckFormKey(form);
CheckFormRole(form);
}
function CheckFormKey(form)
{
@ -381,12 +773,52 @@
formPr.SetKey(key);
form.SetFormPr(formPr);
}
function CheckFormRole(form)
{
let logicDocument = editor && editor.WordControl && editor.WordControl.m_oLogicDocument;
if (!form || !form.IsForm() || !logicDocument)
return;
let role = form.GetFormRole();
if (role && "" !== role.trim())
return;
let oform = logicDocument.GetOFormDocument();
if (!oform)
return;
let defaultRole = oform.getDefaultRole();
if (!defaultRole)
return;
form.SetFormRole(defaultRole.getRole());
}
function ParseRoleColor(color)
{
return color ? AscCommon.RgbaTextToRGBA(color) : {R : 254, G : 248, B : 229, A : 255};
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Export
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Api.prototype["CreateTextForm"] = Api.prototype.CreateTextForm;
Api.prototype["CreatePictureForm"] = Api.prototype.CreatePictureForm;
Api.prototype["CreateCheckBoxForm"] = Api.prototype.CreateCheckBoxForm;
Api.prototype["CreateComboBoxForm"] = Api.prototype.CreateComboBoxForm;
Api["CreateTextForm"] = Api.CreateTextForm;
Api["CreatePictureForm"] = Api.CreatePictureForm;
Api["CreateDateForm"] = Api.CreateDateForm;
Api["CreateCheckBoxForm"] = Api.CreateCheckBoxForm;
Api["CreateComboBoxForm"] = Api.CreateComboBoxForm;
Api["CreateComplexForm"] = Api.CreateComplexForm;
ApiDocument.prototype["InsertTextForm"] = ApiDocument.prototype.InsertTextForm;
ApiDocument.prototype["GetFormRoles"] = ApiDocument.prototype.GetFormRoles;
ApiFormRoles.prototype["Add"] = ApiFormRoles.prototype.Add;
ApiFormRoles.prototype["Remove"] = ApiFormRoles.prototype.Remove;
ApiFormRoles.prototype["GetCount"] = ApiFormRoles.prototype.GetCount;
ApiFormRoles.prototype["GetAllRoles"] = ApiFormRoles.prototype.GetAllRoles;
ApiFormRoles.prototype["HaveRole"] = ApiFormRoles.prototype.HaveRole;
ApiFormRoles.prototype["GetRoleColor"] = ApiFormRoles.prototype.GetRoleColor;
ApiFormRoles.prototype["SetRoleColor"] = ApiFormRoles.prototype.SetRoleColor;
ApiFormRoles.prototype["MoveUp"] = ApiFormRoles.prototype.MoveUp;
ApiFormRoles.prototype["MoveDown"] = ApiFormRoles.prototype.MoveDown;
}(window, null));

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2022
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
@ -12,7 +12,7 @@
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
@ -34,6 +34,8 @@
(function(window)
{
let Api = window["asc_docs_api"];
/**
* @typedef {Object} ContentControl
* Content control object.
@ -41,16 +43,18 @@
* @property {string} Id - A unique identifier of the content control. It can be used to search for a certain content control and make reference to it in the code.
* @property {ContentControlLock} Lock - A value that defines if it is possible to delete and/or edit the content control or not: 0 - only deleting, 1 - no deleting or editing, 2 - only editing, 3 - full access.
* @property {string} InternalId - A unique internal identifier of the content control. It is used for all operations with content controls.
*/
* @see office-js-api/Examples/Plugins/Forms/Enumeration/ContentControl.js
*/
/**
* @typedef {(0 | 1 | 2 | 3)} ContentControlLock
* A value that defines if it is possible to delete and/or edit the content control or not:
* * **0** - only deleting
* * **1** - disable deleting or editing
* * **2** - only editing
* * **3** - full access
*/
* **0** - only deleting
* **1** - disable deleting or editing
* **2** - only editing
* **3** - full access
* @see office-js-api/Examples/Plugins/Forms/Enumeration/ContentControlLock.js
*/
/**
* Returns information about all the forms that have been added to the document.
@ -58,10 +62,9 @@
* @typeofeditors ["CDE"]
* @alias GetAllForms
* @returns {ContentControl[]} - An array with all the forms from the document.
* @example
* window.Asc.plugin.executeMethod("GetAllForms");
* @see office-js-api/Examples/Plugins/Forms/Api/Methods/GetAllForms.js
*/
window["asc_docs_api"].prototype["pluginMethod_GetAllForms"] = function()
Api.prototype["pluginMethod_GetAllForms"] = function()
{
let oFormsManager = this.private_GetFormsManager();
if (!oFormsManager)
@ -82,10 +85,9 @@
* @alias GetFormsByTag
* @param {string} tag - The form tag.
* @returns {ContentControl[]} - An array with all the forms from the document with the specified tag.
* @example
* window.Asc.plugin.executeMethod("GetFormsByTag");
* @see office-js-api/Examples/Plugins/Forms/Api/Methods/GetFormsByTag.js
*/
window["asc_docs_api"].prototype["pluginMethod_GetFormsByTag"] = function(tag)
Api.prototype["pluginMethod_GetFormsByTag"] = function(tag)
{
let oFormsManager = this.private_GetFormsManager();
if (!oFormsManager)
@ -109,108 +111,11 @@
* @alias SetFormValue
* @param {string} internalId - A unique internal identifier of the form.
* @param {string | boolean} value - Form value to be set. Its type depends on the form type.
* @example
* window.Asc.plugin.executeMethod("SetFormValue");
* @see office-js-api/Examples/Plugins/Forms/Api/Methods/SetFormValue.js
*/
window["asc_docs_api"].prototype["pluginMethod_SetFormValue"] = function(internalId, value)
Api.prototype["pluginMethod_SetFormValue"] = function(internalId, value)
{
let oLogicDocument = this.private_GetLogicDocument();
if (!AscCommon.g_oTableId
|| !oLogicDocument
|| !oLogicDocument.IsDocumentEditor())
return;
let oForm = AscCommon.g_oTableId.GetClass(internalId);
if (!oForm
|| !(oForm instanceof AscWord.CInlineLevelSdt)
|| !oForm.IsForm())
return;
let oParagraph = oForm.GetParagraph();
oForm.SkipSpecialContentControlLock(true);
if (!oParagraph
|| oLogicDocument.IsSelectionLocked(AscCommon.changestype_None, {
Type : AscCommon.changestype_2_ElementsArray_and_Type,
Elements : [oParagraph],
CheckType : AscCommon.changestype_Paragraph_Content
}, true, oLogicDocument.IsFillingFormMode()))
{
oForm.SkipSpecialContentControlLock(false);
return;
}
oForm.SkipSpecialContentControlLock(false);
oLogicDocument.StartAction(AscDFH.historydescription_Document_FillFormInPlugin);
let isClear = false;
if (null === value)
{
isClear = true;
}
else if (oForm.IsTextForm() || oForm.IsComboBox())
{
let sValue = AscBuilder.GetStringParameter(value, "");
if (!value)
isClear = true;
else
oForm.SetInnerText(sValue);
}
else if (oForm.IsDropDownList())
{
let sValue = AscBuilder.GetStringParameter(value, "");
let oPr = oForm.GetDropDownListPr();
let nIndex = oPr.FindByText(sValue);
if (-1 !== nIndex)
oForm.SelectListItem(oPr.GetItemValue(nIndex));
else
isClear = true;
}
else if (oForm.IsCheckBox())
{
let isChecked = value === "true" ? true : value === "false" ? false : AscBuilder.GetBoolParameter(value, null);
if (null !== isChecked)
oForm.SetCheckBoxChecked(isChecked);
else
isClear = true;
}
else if (oForm.IsPictureForm())
{
let sValue = AscBuilder.GetStringParameter(value, "");
if (!sValue)
return;
let oImg;
let allDrawings = oForm.GetAllDrawingObjects();
for (let nDrawing = 0; nDrawing < allDrawings.length; ++nDrawing)
{
if (allDrawings[nDrawing].IsPicture())
{
oImg = allDrawings[nDrawing].GraphicObj;
break;
}
}
if (oImg)
{
oForm.SetShowingPlcHdr(false);
oImg.setBlipFill(AscFormat.CreateBlipFillRasterImageId(sValue));
}
else
{
isClear = true;
}
}
if (isClear)
oForm.ClearContentControlExt();
oLogicDocument.OnChangeForm(oForm);
oLogicDocument.Recalculate();
oLogicDocument.UpdateTracks();
oLogicDocument.FinalizeAction();
this.private_SetFormValue(internalId, value);
};
/**
* Returns a value of the specified form.
@ -219,11 +124,9 @@
* @alias GetFormValue
* @param {string} internalId - A unique internal identifier of the form.
* @returns {null | string | boolean} The form value in the string or boolean format depending on the form type. The null value means that the form is filled with a placeholder.
* @example
* window.Asc.plugin.executeMethod("GetFormValue");
*
* @see office-js-api/Examples/Plugins/Forms/Api/Methods/GetFormValue.js
*/
window["asc_docs_api"].prototype["pluginMethod_GetFormValue"] = function(internalId)
Api.prototype["pluginMethod_GetFormValue"] = function(internalId)
{
if (!AscCommon.g_oTableId)
return "";
@ -265,5 +168,29 @@
return "";
};
/**
* Checks whether the specified form has been digitally signed.
* @memberof Api
* @typeofeditors ["CDE"]
* @alias IsFormSigned
* @returns {boolean} Returns true if the form is signed, false otherwise.
* @since 9.3.0
* @see office-js-api/Examples/Plugins/Forms/Api/Methods/IsFormSigned.js
*/
Api.prototype["pluginMethod_IsFormSigned"] = function()
{
let signatures = this.signatures;
if (!signatures || !Array.isArray(signatures))
return false;
for (let i = 0; i < signatures.length; ++i)
{
if (signatures[i].isForm)
return true;
}
return false;
};
})(window);

View File

@ -6,17 +6,22 @@
],
"common": [
"apiBuilder.js",
"oform/Document.js",
"oform/FieldGroup.js",
"oform/FieldMaster.js",
"oform/User.js",
"oform/UserMaster.js",
"oform/changes/DictionaryBase.js",
"oform/changes/DocumentChanges.js",
"oform/changes/FieldGroupChanges.js",
"oform/changes/FieldMasterChanges.js",
"oform/changes/UserChanges.js",
"oform/changes/UserMasterChanges.js"
"oform/OForm.js",
"oform/Role.js",
"oform/xml/XmlPackage.js",
"oform/xml/XmlContext.js",
"oform/format/BaseFormatObject.js",
"oform/format/Document.js",
"oform/format/FieldGroup.js",
"oform/format/FieldMaster.js",
"oform/format/User.js",
"oform/format/UserMaster.js",
"oform/format/changes/DictionaryBase.js",
"oform/format/changes/DocumentChanges.js",
"oform/format/changes/FieldGroupChanges.js",
"oform/format/changes/FieldMasterChanges.js",
"oform/format/changes/UserChanges.js",
"oform/format/changes/UserMasterChanges.js"
]
}
}

View File

@ -1,227 +0,0 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function(window)
{
/**
* Основной класс для работы с форматом oform
* @constructor
*/
function CDocument()
{
AscFormat.CBaseFormatObject.call(this);
this.Author = null;
this.Date = null;
this.Description = null;
this.Type = null;
this.Application = null;
this.DocumentId = null;
this.FieldGroups = [];
this.Users = [];
this.Fields = [];
}
AscFormat.InitClass(CDocument, AscFormat.CBaseFormatObject, AscDFH.historyitem_type_OForm_Document);
CDocument.prototype.setAuthor = function(author)
{
if (this.Author === author)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentAuthor(this, this.Author, author));
this.Author = author;
};
CDocument.prototype.setDate = function(date)
{
if (this.Date === date)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentDate(this, this.Date, date));
this.Date = date;
};
CDocument.prototype.setDescription = function(description)
{
if (this.Description === description)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentDescription(this, this.Description, description));
this.Description = description;
};
CDocument.prototype.setType = function(type)
{
if (this.Type === type)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentType(this, this.Type, type));
this.Type = type;
};
CDocument.prototype.setApplication = function(app)
{
if (this.Application === app)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentApplication(this, this.Application, app));
this.Application = app;
};
CDocument.prototype.setDocumentId = function(documentId)
{
if (this.DocumentId === documentId)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentDocumentId(this, this.DocumentId, documentId));
this.DocumentId = documentId;
};
CDocument.prototype.addFieldGroup = function(fieldGroup)
{
if (-1 !== this.FieldGroups.indexOf(fieldGroup))
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentFieldGroup(this, fieldGroup.GetId(), true));
this.FieldGroups.push(fieldGroup);
};
CDocument.prototype.removeFieldGroup = function(fieldGroup)
{
if (!fieldGroup)
return;
let index = this.FieldGroups.indexOf(fieldGroup);
if (-1 === index)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentFieldGroup(this, fieldGroup.GetId(), false));
this.FieldGroups.splice(index, 1);
};
CDocument.prototype.readChildXml = function(name, reader)
{
// TODO: fix me
switch (name)
{
case "Author":
{
let oNode = new CT_XmlNode();
oNode.fromXml(reader);
let sAuthor = oNode.attributes["id"];
if (sAuthor)
{
this.setAuthor(sAuthor);
}
break;
}
case "Date":
{
let oDate = new CFormDate();
oDate.fromXml(reader);
this.setDate(oDate);
break;
}
case "Description":
{
let oNode = new CT_XmlNode();
oNode.fromXml(reader);
this.setDescription(oNode.text);
break;
}
case "Type":
{
let oNode = new CT_XmlNode();
oNode.fromXml(reader);
this.setType(oNode.text);
break;
}
case "Application":
{
let oNode = new CT_XmlNode();
oNode.fromXml(reader);
this.setApplication(oNode.text);
break;
}
case "Id":
{
let oNode = new CT_XmlNode();
oNode.fromXml(reader);
this.setDocumentId(oNode.text);
break;
}
case "FieldsGroup":
{
let oFieldsGroup = new CFieldsGroup();
oFieldsGroup.fromXml(reader);
this.addFieldsGroups(oFieldsGroup);
break;
}
}
};
CDocument.prototype.toXml = function(writer)
{
// TODO: fix me
writer.WriteXmlString(AscCommonWord.g_sXmlHeader);
writer.WriteXmlNodeStart("Document");
writer.WriteXmlAttributeString("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
writer.WriteXmlAttributesEnd();
if (this.Author)
{
let oNode = new CT_XmlNode();
oNode.attributes["id"] = this.Author;
oNode.toXml(writer, "Author");
}
if (this.Date)
{
this.Date.toXml(writer);
}
let oDescriptionNode = new CT_XmlNode();
oDescriptionNode.text = this.Description;
oDescriptionNode.toXml(writer, "Description");
let oTypeNode = new CT_XmlNode();
oTypeNode.text = this.Type;
oTypeNode.toXml(writer, "Type");
let oAppNode = new CT_XmlNode();
oAppNode.text = this.Application;
oAppNode.toXml(writer, "Application");
let oIdNode = new CT_XmlNode();
oIdNode.text = this.DocumentId;
oIdNode.toXml(writer, "Id");
for (let nFG = 0; nFG < this.FieldsGroups.length; ++nFG)
{
this.FieldsGroups[nFG].toXml(writer);
}
writer.WriteXmlNodeEnd("Document");
};
//--------------------------------------------------------export----------------------------------------------------
AscOForm.CDocument = CDocument;
})(window);

View File

@ -1,197 +0,0 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function(window)
{
/**
*
* @constructor
*/
function CFieldMaster()
{
AscFormat.CBaseFormatObject.call(this);
this.FieldId = null;
this.Field = null;
this.Users = [];
this.Signers = [];
}
AscFormat.InitClass(CFieldMaster, AscFormat.CBaseFormatObject, AscDFH.historyitem_type_OForm_FieldMaster);
CFieldMaster.prototype.setLogicField = function(logicField)
{
this.Field = logicField;
};
CFieldMaster.prototype.setFieldId = function(fieldId)
{
if (fieldId === this.FieldId)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldMasterFieldId(this, this.FieldId, fieldId));
this.FieldId = fieldId;
};
CFieldMaster.prototype.getFieldId = function()
{
return this.FieldId;
};
CFieldMaster.prototype.addUser = function(user)
{
if (-1 !== this.Users.indexOf(user))
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldMasterAddRemoveUser(this, user.GetId(), true));
this.Users.push(user);
};
CFieldMaster.prototype.removeUser = function(user)
{
let index = this.User.indexOf(user);
if (-1 === index)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldMasterAddRemoveUser(this, user.GetId(), false));
this.Users.splice(index, 1);
};
CFieldMaster.prototype.addSigner = function(user)
{
if (-1 !== this.Signers.indexOf(user))
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldMasterAddRemoveSigner(this, user.GetId(), true));
this.Signers.push(user);
};
CFieldMaster.prototype.removeSigner = function(user)
{
let index = this.Signers.indexOf(user);
if (-1 === index)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldMasterAddRemoveSigner(this, user.GetId(), false));
this.Signers.splice(index, 1);
};
CFieldMaster.prototype.readAttrXml = function(name, reader)
{
switch (name)
{
case "id":
{
this.setFieldId(reader.GetValue());
break;
}
}
};
CFieldMaster.prototype.readChildXml = function(name, reader)
{
let oThis = this;
switch (name)
{
case "Users":
{
let oUsersNode = new CT_XmlNode(function(reader, name)
{
if (name === "User")
{
let oUserNode = new CT_XmlNode();
oUserNode.fromXml(reader);
let sId = oUserNode.attributes["id"];
let oRel = reader.rels.getRelationshipById(sId);
reader.context.addFieldMasterRelation(oThis, oRel.targetFullName)
}
return true;
});
oUsersNode.fromXml(reader);
break;
}
case "SignRequest":
{
let oSignRequest = new CSignRequest();
oSignRequest.fromXml(reader);
this.setSignRequest(oSignRequest);
break;
}
}
};
CFieldMaster.prototype.toXml = function(writer)
{
writer.WriteXmlString(AscCommonWord.g_sXmlHeader);
writer.WriteXmlNodeStart("FieldMaster");
writer.WriteXmlAttributeString("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
writer.WriteXmlNullableAttributeString("id", this.FieldId);
writer.WriteXmlAttributesEnd();
writer.WriteXmlNodeStart("Users");
writer.WriteXmlAttributesEnd();
let oContext = writer.context;
let oUserMasterPartMap = oContext.userMasterPartMap;
let oUsersIdMap = {};
for (let nUser = 0; nUser < this.Users.length; ++nUser)
{
let oUser = this.Users[nUser];
let oPart = oUserMasterPartMap[oUser.Id];
if (!oPart)
{
oPart = writer.context.part.addPart(AscCommon.openXml.Types.userMaster);
let oUserMemory = new AscCommon.CMemory();
oUserMemory.context = writer.context;
oPart.part.setDataXml(oUser, oUserMemory);
oUserMasterPartMap[oUser.Id] = oPart;
}
let oNode = new CT_XmlNode();
let sRId = oContext.part.addRelationship(AscCommon.openXml.Types.userMaster.relationType, oPart.uri);
oNode.attributes["r:id"] = sRId
oUsersIdMap[oUser.Id] = sRId;
oNode.toXml(writer, "User");
}
writer.WriteXmlNodeEnd("Users");
if (this.SignRequest)
{
this.SignRequest.toXml(writer, oUsersIdMap);
}
writer.WriteXmlNodeEnd("FieldMaster");
if (writer.context.fileType === Asc.c_oAscFileType.OFORM)
{
if (this.Field)
{
let oPart = writer.context.docPart.part.addPartWithoutRels(AscCommon.openXml.Types.field);
let oMemory = new AscCommon.CMemory();
oMemory.context = writer.context;
oPart.setDataXml(this.Field, oMemory);
oMemory.Seek(0);
oPart.addRelationship(AscCommon.openXml.Types.fieldMaster.relationType, oContext.part.uri)
}
}
};
//--------------------------------------------------------export----------------------------------------------------
AscOForm.CFieldMaster = CFieldMaster;
})(window);

746
oform/OForm.js Normal file
View File

@ -0,0 +1,746 @@
/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function(window)
{
/**
* Main class for working with the oform format
* @param document {AscWord.CDocument}
* @constructor
*/
function OForm(document)
{
this.Format = new AscOForm.CDocument(this);
this.Document = document;
this.CurrentUser = null;
// Currently, a role is exactly one userMaster and exactly one field group
this.Roles = [];
this.NeedUpdateRoles = true;
this.NeedRedraw = true;
}
/**
* @returns {AscWord.CDocument}
*/
OForm.prototype.getDocument = function()
{
return this.Document;
};
/**
* @returns {AscOForm.CDocument}
*/
OForm.prototype.getFormat = function()
{
return this.Format;
};
OForm.prototype.fromZip = function(zip, opt_sdtPrWithFieldPath)
{
let xmlPkg = new AscOForm.XmlPackage(zip);
xmlPkg.setContext(new AscOForm.XmlReaderContext(xmlPkg));
this.Format.fromPkg(xmlPkg, opt_sdtPrWithFieldPath);
};
OForm.prototype.toZip = function(zip, opt_fieldMastersPartMap)
{
let writer = new AscCommon.CMemory();
let xmlPkg = new AscOForm.XmlPackage(zip, writer);
xmlPkg.setContext(new AscOForm.XmlWriterContext(xmlPkg));
writer.context = xmlPkg.getContext();
this.Format.toPkg(xmlPkg, opt_fieldMastersPartMap);
// Our XmlPackage works in the shared folder, but we need to put the oform subfolder into zip
zip.getPaths().forEach(function(path)
{
let fileData = zip.getFile(path);
if (path.startsWith("oform/"))
zip.addFile(path.substr(6), fileData);
zip.removeFile(path);
});
};
OForm.prototype.setCurrentRole = function(roleName)
{
let role = this.getRole(roleName);
if (!role)
return;
this.CurrentUser = role.getUserMaster();
};
/**
* Difference between noRole and when role is not set, is that when role is not set we can fill any field,
* but when noRole is set then we can't fill anything
*/
OForm.prototype.setCurrentNoRole = function()
{
this.CurrentUser = AscOForm.getNoRole();
};
OForm.prototype.clearCurrentRole = function()
{
this.CurrentUser = null;
};
OForm.prototype.getCurrentRole = function()
{
return this.CurrentUser ? this.CurrentUser.getRole() : null;
};
OForm.prototype.getCurrentUserMaster = function()
{
return this.CurrentUser;
};
OForm.prototype.getAllRoles = function()
{
this.updateRoles();
return this.Roles;
};
/**
* @param roleSettings {AscOForm.CRoleSettings}
*/
OForm.prototype.addRole = function(roleSettings)
{
let name = "";
if ("string" === typeof roleSettings)
{
name = roleSettings;
roleSettings = new AscOForm.CRoleSettings();
roleSettings.setName(name);
}
if (roleSettings instanceof AscOForm.CRoleSettings)
name = roleSettings.getName();
else
return false;
if (this.haveRole(name))
return false;
if (!this.startAction(AscDFH.historydescription_OForm_AddRole))
return false;
let userMaster = new AscOForm.CUserMaster(true);
userMaster.setRole(name);
let color = roleSettings.getColor();
if (color)
userMaster.setColor(color.r, color.g, color.b);
let fieldGroup = new AscOForm.CFieldGroup();
fieldGroup.setWeight(this.Format.getMaxWeight() + 1);
fieldGroup.addUser(userMaster);
this.Format.addFieldGroup(fieldGroup);
this.Format.addUserMaster(userMaster);
this.endAction();
return true;
};
OForm.prototype.removeRole = function(name, delegateName)
{
this.updateRoles();
let roleIndex = this.getRoleIndex(name);
if (-1 === roleIndex)
return false;
let userMaster = this.Roles[roleIndex].getUserMaster();
let fieldGroup = this.Roles[roleIndex].getFieldGroup();
let fields = fieldGroup.getAllFields();
let delegateIndex = this.getRoleIndex(delegateName);
// Actually, we can remove this check, but then we would just delete the default group and add it again
if (this.Roles.length <= 1
&& this.Roles[roleIndex].getUserMaster() === this.Format.getDefaultUserMaster()
&& -1 === delegateIndex)
{
let defaultUserMaster = this.Format.getDefaultUserMaster();
if (!defaultUserMaster.isDefaultUserProps())
{
if (!this.startAction(AscDFH.historydescription_OForm_RemoveRole))
return false;
defaultUserMaster.initDefaultUser();
this.NeedRedraw = true;
this.endAction();
return true;
}
return false;
}
if (!this.startAction(AscDFH.historydescription_OForm_RemoveRole))
return false;
fieldGroup.clear();
this.Format.removeFieldGroup(fieldGroup);
this.Format.removeUserMaster(userMaster);
if (fields.length > 0)
{
let delegateUserMaster, delegateFieldGroup;
if (-1 === delegateIndex || delegateIndex === roleIndex)
{
let defaultRole = this.getDefaultRole();
if (defaultRole)
{
delegateUserMaster = defaultRole.getUserMaster();
delegateFieldGroup = defaultRole.getFieldGroup();
}
else
{
let defaultGroup = new AscOForm.CFieldGroup();
defaultGroup.setWeight(this.Format.getMaxWeight() + 1);
this.Format.addFieldGroup(defaultGroup);
defaultGroup.addUser(this.Format.getDefaultUserMaster());
delegateUserMaster = this.Format.getDefaultUserMaster();
delegateFieldGroup = defaultGroup;
}
}
else
{
delegateUserMaster = this.Roles[delegateIndex].getUserMaster();
delegateFieldGroup = this.Roles[delegateIndex].getFieldGroup();
}
for (let index = 0, count = fields.length; index < count; ++index)
{
let fieldMaster = fields[index];
fieldMaster.removeUser(userMaster);
fieldMaster.addUser(delegateUserMaster);
}
delegateFieldGroup.addUser(delegateUserMaster);
this.Format.addFieldGroup(delegateFieldGroup);
if (!this.getDefaultRole() && delegateUserMaster)
this.Format.setDefaultUser(delegateUserMaster);
}
if (!this.getDefaultRole())
{
let delegateUserMaster;
if (-1 === delegateIndex || delegateIndex === roleIndex)
{
this.updateRoles();
if (this.Roles.length <= 0)
{
let defaultGroup = new AscOForm.CFieldGroup();
defaultGroup.setWeight(this.Format.getMaxWeight() + 1);
this.Format.addFieldGroup(defaultGroup);
defaultGroup.addUser(this.Format.getDefaultUserMaster());
delegateUserMaster = this.Format.getDefaultUserMaster();
delegateUserMaster.initDefaultUser();
}
else
{
delegateUserMaster = this.Roles[0].getUserMaster();
}
}
else
{
delegateUserMaster = this.Roles[delegateIndex].getUserMaster();
}
if (delegateUserMaster)
this.Format.setDefaultUser(delegateUserMaster);
}
this.NeedRedraw = true;
this.endAction();
return true;
};
OForm.prototype.editRole = function(name, roleSettings)
{
let role = this.getRole(name);
if (!role)
return false;
let newName = roleSettings.getName();
if (undefined !== newName
&& null !== newName
&& name !== newName
&& this.haveRole(newName))
return false;
if (!this.startAction(AscDFH.historyitem_OForm_EditRole))
return false;
let userMaster = role.getUserMaster();
if (undefined !== roleSettings.getName())
userMaster.setRole(roleSettings.getName());
let color = roleSettings.getColor();
if (null === color)
userMaster.setColor(color);
else if (undefined !== color)
userMaster.setColor(color.r, color.g, color.b);
this.endAction();
return true;
};
OForm.prototype.moveUpRole = function(name)
{
let role = this.getRole(name);
if (!role)
return false;
let weight = role.getWeight();
let sameWeightRoles = this.getRolesByWeight(weight);
if (weight === this.Format.getMinWeight() && sameWeightRoles.length <= 1)
return false;
if (!this.startAction(AscDFH.historydescription_OForm_ChangeRoleOrder))
return false;
if (sameWeightRoles.length > 1)
{
for (let index = 0, count = this.Roles.length; index < count; ++index)
{
let curRole = this.Roles[index];
let curWeight = curRole.getWeight();
if (role !== curRole && curWeight >= weight)
{
curRole.setWeight(curWeight + 1);
}
}
}
let prevWeight = -1;
for (let index = 0, count = this.Roles.length; index < count; ++index)
{
let curRole = this.Roles[index];
let curWeight = curRole.getWeight();
if (curWeight < weight)
{
if (-1 === prevWeight || prevWeight < curWeight)
prevWeight = curWeight;
}
}
if (-1 !== prevWeight)
{
let prevRoles = this.getRolesByWeight(prevWeight);
role.setWeight(prevWeight);
for (let index = 0, count = prevRoles.length; index < count; ++index)
{
prevRoles[index].setWeight(weight);
}
}
this.endAction();
return true;
};
OForm.prototype.moveDownRole = function(name)
{
let role = this.getRole(name);
if (!role)
return false;
let weight = role.getWeight();
let sameWeightRoles = this.getRolesByWeight(weight);
if (weight === this.Format.getMaxWeight() && sameWeightRoles.length <= 1)
return false;
if (!this.startAction(AscDFH.historydescription_OForm_ChangeRoleOrder))
return false;
if (sameWeightRoles.length > 1)
{
weight++;
if (this.getRolesByWeight(weight + 1).length)
{
for (let index = 0, count = this.Roles.length; index < count; ++index)
{
let curRole = this.Roles[index];
let curWeight = curRole.getWeight();
if (curWeight > weight)
{
curRole.setWeight(curWeight + 1);
}
}
}
}
let nextWeight = -1;
for (let index = 0, count = this.Roles.length; index < count; ++index)
{
let curRole = this.Roles[index];
let curWeight = curRole.getWeight();
if (curWeight > weight)
{
if (-1 === nextWeight || nextWeight > curWeight)
nextWeight = curWeight;
}
}
if (-1 !== nextWeight)
{
let nextRoles = this.getRolesByWeight(nextWeight);
role.setWeight(nextWeight);
for (let index = 0, count = nextRoles.length; index < count; ++index)
{
nextRoles[index].setWeight(weight);
}
}
else if (weight !== role.getWeight())
{
role.setWeight(weight);
}
this.endAction();
return true;
};
OForm.prototype.getRole = function(name)
{
let roleIndex = this.getRoleIndex(name);
if (-1 === roleIndex)
return null;
return this.Roles[roleIndex];
};
OForm.prototype.getRoleIndex = function(name)
{
this.updateRoles();
for (let index = 0, count = this.Roles.length; index < count; ++index)
{
if (name === this.Roles[index].getRole())
return index;
}
return -1;
};
OForm.prototype.getRolesByWeight = function(weight)
{
this.updateRoles();
let roles = [];
for (let index = 0, count = this.Roles.length; index < count; ++index)
{
if (this.Roles[index].getWeight() === weight)
roles.push(this.Roles[index]);
}
return roles;
};
OForm.prototype.haveRole = function(name)
{
return !!(this.getRole(name));
};
OForm.prototype.getRoleSettings = function(name)
{
let role = this.getRole(name);
if (!role)
return null;
return role.getSettings();
};
OForm.prototype.getDefaultRole = function()
{
this.updateRoles();
let defaultUser = this.Format.getDefaultUserMaster();
for (let index = 0, count = this.Roles.length; index < count; ++index)
{
if (defaultUser === this.Roles[index].getUserMaster())
return this.Roles[index];
}
return null;
};
OForm.prototype.onChangeRoles = function()
{
this.NeedUpdateRoles = true;
};
OForm.prototype.onChangeFieldGroupFilled = function(fieldGroup)
{
if (!this.Document)
return;
for (let i = 0; i < this.Roles.length; ++i)
{
let role = this.Roles[i];
if (fieldGroup === role.getFieldGroup())
{
this.Document.sendEvent("asc_onOFormRoleFilled", role.getRole(), fieldGroup.isFilled());
return;
}
}
};
OForm.prototype.onChangeRoleColor = function()
{
this.NeedRedraw = true;
};
OForm.prototype.checkRedraw = function()
{
if (!this.NeedRedraw)
return;
this.NeedRedraw = false;
this.Document.Redraw();
};
OForm.prototype.updateRoles = function()
{
if (!this.NeedUpdateRoles)
return;
this.NeedUpdateRoles = false;
this.Roles = [];
for (let fgIndex = 0, fgCount = this.Format.getFieldGroupsCount(); fgIndex < fgCount; ++fgIndex)
{
let fieldGroup = this.Format.getFieldGroup(fgIndex);
let user = fieldGroup.getFirstUser();
if (!user)
{
// TODO: Handle such groups
}
let haveRole = false;
for (let roleIndex = 0, roleCount = this.Roles.length; roleIndex < roleCount; ++roleIndex)
{
if (this.Roles[roleIndex].getUserMaster() === user)
{
haveRole = true;
break;
}
}
if (haveRole)
{
// TODO: Handle such situations
}
let weight = fieldGroup.getWeight();
let newRoleIndex = this.Roles.length;
for (let roleIndex = 0, roleCount = this.Roles.length; roleIndex < roleCount; ++roleIndex)
{
let curWeight = this.Roles[roleIndex].getWeight();
if (weight < curWeight || (weight === curWeight && user.compare(this.Roles[roleIndex].getUserMaster()) < 0))
{
newRoleIndex = roleIndex;
break;
}
}
let newRole = new AscOForm.CRole(fieldGroup, user);
if (newRoleIndex === this.Roles.length)
this.Roles.push(newRole);
else
this.Roles.splice(newRoleIndex, 0, newRole);
}
this.onUpdateRoles();
};
OForm.prototype.correctFieldGroups = function()
{
// Check if there is at least one group with a specified role (where userMaster is set)
for (let fgIndex = 0, fgCount = this.Format.getFieldGroupsCount(); fgIndex < fgCount; ++fgIndex)
{
let fieldGroup = this.Format.getFieldGroup(fgIndex);
let user = fieldGroup.getFirstUser();
if (!user)
continue;
return;
}
// There must be at least one group
let defaultGroup = new AscOForm.CFieldGroup();
defaultGroup.setWeight(this.Format.getMaxWeight() + 1);
this.Format.addFieldGroup(defaultGroup);
defaultGroup.addUser(this.Format.getDefaultUserMaster());
};
OForm.prototype.onEndLoad = function()
{
this.NeedUpdateRoles = true;
this.Format.correctFieldMasters(this.getDocument());
this.correctFieldGroups();
this.updateRoles();
};
OForm.prototype.onUpdateRoles = function()
{
let logicDocument = this.getDocument();
let api;
if (!logicDocument || !(api = logicDocument.GetApi()))
return;
api.sendEvent("asc_onUpdateOFormRoles", this.Roles);
};
OForm.prototype.onEndAction = function()
{
this.Format.removeUnusedFieldMasters();
this.Format.correctFieldMasters(this.getDocument());
this.correctFieldGroups();
this.updateRoles();
this.checkRedraw();
};
OForm.prototype.onUndoRedo = function()
{
this.updateRoles();
this.checkRedraw();
};
OForm.prototype.onEndLoadChanges = function()
{
this.onUndoRedo();
};
OForm.prototype.canFillRole = function(roleName)
{
let role = this.getRole(roleName);
if (!role || role.isFilled())
return false;
let weight = role.getWeight();
for (let i = 0; i < this.Roles.length; ++i)
{
if (this.Roles[i] === role || this.Roles[i].isFilled())
continue;
if (this.Roles[i].getWeight() < weight)
return false;
}
return true;
};
OForm.prototype.setRoleFilled = function(roleName, isFilled)
{
let role = this.getRole(roleName);
if (!role)
return;
role.setFilled(isFilled);
};
OForm.prototype.setAllRolesNotFilled = function()
{
for (let roleIndex = 0, roleCount = this.Roles.length; roleIndex < roleCount; ++roleIndex)
{
this.Roles[roleIndex].setFilled(false);
}
};
OForm.prototype.setAllRolesFilled = function(userPr)
{
let name = userPr ? userPr.name : null;
let id = userPr ? userPr.id : null;
let email = userPr ? userPr.email : null;
for (let roleIndex = 0, roleCount = this.Roles.length; roleIndex < roleCount; ++roleIndex)
{
let role = this.Roles[roleIndex];
if (role.isFilled())
continue;
role.setFilled(true);
let userMaster = role.getUserMaster();
if (!userMaster)
continue;
if (name)
userMaster.setUserName(name);
if (id)
userMaster.setUserId(id);
if (email)
userMaster.setEmail(email);
}
};
OForm.prototype.isAllRolesFilled = function()
{
for (let roleIndex = 0, roleCount = this.Roles.length; roleIndex < roleCount; ++roleIndex)
{
if (!this.Roles[roleIndex].isFilled())
return false;
}
return true;
};
OForm.prototype.isFinal = function()
{
return this.Format.isFinal();
};
OForm.prototype.setFinal = function(isFinal)
{
return this.Format.setFinal(isFinal);
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Private area
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
OForm.prototype.startAction = function(description)
{
let logicDocument = this.getDocument();
if (!logicDocument)
return false;
if (logicDocument.IsSelectionLocked(AscCommon.changestype_Document_Settings, null, false, false, null))
return false;
logicDocument.StartAction(description);
return true;
};
OForm.prototype.endAction = function()
{
let logicDocument = this.getDocument();
if (!logicDocument)
return;
logicDocument.UpdateInterface();
logicDocument.FinalizeAction();
};
OForm.prototype.sendEvent = function()
{
let logicDocument = this.getDocument();
let api;
if (!logicDocument || !(api = logicDocument.GetApi()))
return;
api.sendEvent.apply(api, arguments);
};
//--------------------------------------------------------export----------------------------------------------------
AscOForm.OForm = OForm;
//---------------------------------------------interface export-----------------------------------------------------
OForm.prototype['asc_getAllRoles'] = OForm.prototype.getAllRoles;
OForm.prototype['asc_addRole'] = OForm.prototype.addRole;
OForm.prototype['asc_removeRole'] = OForm.prototype.removeRole;
OForm.prototype['asc_editRole'] = OForm.prototype.editRole;
OForm.prototype['asc_moveUpRole'] = OForm.prototype.moveUpRole;
OForm.prototype['asc_moveDownRole'] = OForm.prototype.moveDownRole;
OForm.prototype['asc_haveRole'] = OForm.prototype.haveRole;
OForm.prototype['asc_getRole'] = OForm.prototype.getRoleSettings;
OForm.prototype['asc_canFillRole'] = OForm.prototype.canFillRole;
})(window);

172
oform/Role.js Normal file
View File

@ -0,0 +1,172 @@
/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function(window)
{
/**
* Class representing a role when filling out a form. Currently, a role is exactly one userMaster
* and a field group associated with this userMaster
* @param fieldGroup
* @param userMaster
* @constructor
*/
function CRole(fieldGroup, userMaster)
{
this.FieldGroup = fieldGroup;
this.UserMaster = userMaster;
}
CRole.prototype.getSettings = function()
{
let r = new CRoleSettings();
if (this.UserMaster)
{
r.setName(this.UserMaster.getRole());
r.setColor(this.UserMaster.getColor());
}
if (this.FieldGroup)
r.setFieldCount(this.FieldGroup.getAllFields().length)
return r;
};
CRole.prototype.getRole = function()
{
return this.UserMaster.getRole();
};
CRole.prototype.getUserMaster = function()
{
return this.UserMaster;
};
CRole.prototype.getWeight = function()
{
return this.FieldGroup.getWeight();
};
CRole.prototype.setWeight = function(weight)
{
if (this.FieldGroup)
this.FieldGroup.setWeight(weight);
};
CRole.prototype.isFilled = function()
{
return this.FieldGroup ? this.FieldGroup.isFilled() : true;
};
CRole.prototype.setFilled = function(isFilled)
{
if (!this.FieldGroup || isFilled === this.FieldGroup.isFilled())
return;
this.FieldGroup.setFilled(isFilled);
if (isFilled)
{
this.FieldGroup.setDate(Date.now());
}
else
{
this.UserMaster.setUserId(AscCommon.CreateGUID());
this.UserMaster.setUserName(undefined);
this.UserMaster.setUserEmail(undefined);
this.FieldGroup.setDate(undefined);
}
};
CRole.prototype.getFieldGroup = function()
{
return this.FieldGroup;
};
/**
* Class for setting role configuration from the interface
* @constructor
*/
function CRoleSettings()
{
this.Name = "";
this.Color = null;
this.FieldCount = 0;
}
CRoleSettings.prototype.getName = function()
{
return this.Name;
};
CRoleSettings.prototype.setName = function(name)
{
this.Name = name;
};
CRoleSettings.prototype.setColor = function(color)
{
this.Color = color ? color.Copy() : null;
};
CRoleSettings.prototype.getColor = function()
{
return this.Color;
};
CRoleSettings.prototype.setAscColor = function(ascColor)
{
if (undefined === ascColor || null === ascColor)
this.Color = null;
else
this.Color = new AscWord.CDocumentColor(ascColor.asc_getR(), ascColor.asc_getG(), ascColor.asc_getB());
}
CRoleSettings.prototype.getAscColor = function()
{
if (!this.Color)
return null;
return new Asc.asc_CColor(this.Color.r, this.Color.g, this.Color.b);
};
CRoleSettings.prototype.haveColor = function()
{
return (!!this.Color);
};
CRoleSettings.prototype.setFieldCount = function(count)
{
this.FieldCount = count;
};
CRoleSettings.prototype.getFieldCount = function()
{
return this.FieldCount;
};
//--------------------------------------------------------export----------------------------------------------------
AscOForm.CRole = CRole;
AscOForm.CRoleSettings = CRoleSettings;
//---------------------------------------------interface export-----------------------------------------------------
CRole.prototype['asc_getSettings'] = CRole.prototype.getSettings;
window['AscCommon']["CRoleSettings"] = CRoleSettings;
CRoleSettings.prototype["asc_getName"] = CRoleSettings.prototype.getName;
CRoleSettings.prototype["asc_putName"] = CRoleSettings.prototype.setName;
CRoleSettings.prototype["asc_getColor"] = CRoleSettings.prototype.getAscColor;
CRoleSettings.prototype["asc_putColor"] = CRoleSettings.prototype.setAscColor;
CRoleSettings.prototype["asc_getFieldCount"] = CRoleSettings.prototype.getFieldCount;
})(window);

View File

@ -1,101 +0,0 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function(window)
{
/**
*
* @constructor
*/
function CUserMaster()
{
AscFormat.CBaseFormatObject.call(this);
this.UserId = undefined;
this.Role = undefined;
}
AscFormat.InitClass(CUserMaster, AscFormat.CBaseFormatObject, AscDFH.historyitem_type_OForm_UserMaster);
CUserMaster.prototype.setUserId = function(userId)
{
if (userId === this.UserId)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormUserMasterUserId(this, this.UserId, userId));
this.UserId = userId;
};
CUserMaster.prototype.setRole = function(role)
{
if (role === this.Role)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormUserMasterRole(this, this.Role, role));
this.Role = role;
};
CUserMaster.prototype.readChildXml = function(name, reader)
{
let bRead = false;
switch (name)
{
case "Id":
{
let oNode = new CT_XmlNode();
oNode.fromXml(reader);
this.setUserId(oNode.text);
bRead = true;
break;
}
case "Role":
{
let oNode = new CT_XmlNode();
oNode.fromXml(reader);
this.setRole(oNode.text);
bRead = true;
break;
}
}
return bRead;
};
CUserMaster.prototype.toXml = function(writer)
{
writer.WriteXmlString(AscCommonWord.g_sXmlHeader);
writer.WriteXmlNodeStart("UserMaster");
writer.WriteXmlAttributesEnd();
writer.WriteXmlNodeWithText("Id", this.UserId);
writer.WriteXmlNodeWithText("Role", this.Role);
writer.WriteXmlNodeEnd("UserMaster");
};
//--------------------------------------------------------export----------------------------------------------------
AscOForm.CUserMaster = CUserMaster;
})(window);

View File

@ -1,80 +0,0 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function(window)
{
window['AscDFH'].historyitem_OForm_UserMaster_UserId = window['AscDFH'].historyitem_type_OForm_UserMaster | 1;
window['AscDFH'].historyitem_OForm_UserMaster_Role = window['AscDFH'].historyitem_type_OForm_UserMaster | 2;
/**
* @constructor
* @extends {window['AscDFH'].CChangesBaseStringProperty}
*/
function CChangesOFormUserMasterUserId(Class, Old, New)
{
window['AscDFH'].CChangesBaseStringProperty.call(this, Class, Old, New);
}
window['AscDFH'].InheritPropertyChange(
CChangesOFormUserMasterUserId,
window['AscDFH'].CChangesBaseStringProperty,
window['AscDFH'].historyitem_OForm_UserMaster_UserId,
function(Value)
{
this.Class.UserId = Value;
},
false
);
window['AscDFH'].CChangesOFormUserMasterUserId = CChangesOFormUserMasterUserId;
/**
* @constructor
* @extends {window['AscDFH'].CChangesBaseStringProperty}
*/
function CChangesOFormUserMasterRole(Class, Old, New)
{
window['AscDFH'].CChangesBaseStringProperty.call(this, Class, Old, New);
}
window['AscDFH'].InheritPropertyChange(
CChangesOFormUserMasterRole,
window['AscDFH'].CChangesBaseStringProperty,
window['AscDFH'].historyitem_OForm_UserMaster_Role,
function(Value)
{
this.Class.Role = Value;
},
false
);
window['AscDFH'].CChangesOFormUserMasterRole = CChangesOFormUserMasterRole;
})(window);

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
@ -12,7 +12,7 @@
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
@ -34,55 +34,43 @@
(function(window)
{
/**
* Base class for all format classes in oform
* @constructor
*/
function CFieldGroup()
function CBaseFormatObject()
{
AscFormat.CBaseFormatObject.call(this);
this.Weight = null;
this.Fields = [];
this.Id = null;
if (!AscCommon.g_oIdCounter.m_bLoad && !AscCommon.History.CanAddChanges())
return;
this.Id = AscCommon.g_oIdCounter.GetNewIdForOForm();
AscCommon.g_oTableId.Add(this, this.Id);
}
AscFormat.InitClass(CFieldGroup, AscFormat.CBaseFormatObject, AscDFH.historyitem_type_OForm_FieldGroup);
CFieldGroup.prototype.setWeight = function(value)
CBaseFormatObject.prototype.GetId = function()
{
if (this.Weight === value)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldGroupWeight(this, this.Weight, value));
this.Weight = value;
return this.Id;
};
CFieldGroup.prototype.addField = function(field)
CBaseFormatObject.prototype.Get_Id = function()
{
if (!field || -1 !== this.Fields.indexOf(field))
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldGroupAddRemoveField(this, field.GetId(), true));
this.Fields.push(field);
return this.Id;
};
CFieldGroup.prototype.removeField = function(field)
CBaseFormatObject.prototype.Write_ToBinary2 = function(writer)
{
if (!field)
return;
let index = this.Fields.indexOf(field);
if (-1 === index)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldGroupAddRemoveField(this, field.GetId(), false));
this.Fields.splice(index, 1);
writer.WriteLong(this.classType);
writer.WriteString2(this.GetId());
};
CFieldGroup.prototype.readChildXml = function(name, reader)
CBaseFormatObject.prototype.Read_FromBinary2 = function(reader)
{
// TODO: implement
return false;
this.Id = reader.GetString2();
};
CFieldGroup.prototype.toXml = function(writer)
CBaseFormatObject.prototype.Refresh_RecalcData = function(change)
{
// TODO: implement
};
//--------------------------------------------------------export----------------------------------------------------
AscOForm.CFieldGroup = CFieldGroup;
AscOForm.CBaseFormatObject = CBaseFormatObject;
})(window);

659
oform/format/Document.js Normal file
View File

@ -0,0 +1,659 @@
/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function(window)
{
/**
* Main class for working with the oform format
* @param oform {AscOForm.OForm}
* @constructor
* @extends AscOForm.CBaseFormatObject
*/
function CDocument(oform)
{
AscOForm.CBaseFormatObject.call(this);
this.OForm = oform;
this.DefaultUser = new AscOForm.CUserMaster();
this.DefaultUser.initDefaultUser();
this.DefaultUser.setParent(this);
// Format properties
this.Author = null;
this.Date = null;
this.Description = null;
this.Type = null;
this.Application = null;
this.DocumentId = null;
this.Final = false;
this.FieldGroups = [];
// Arrays of all existing users and fields
this.Users = [];
this.UserMasters = [];
this.FieldMasters = [];
}
AscFormat.InitClass(CDocument, AscOForm.CBaseFormatObject, AscDFH.historyitem_type_OForm_Document);
CDocument.prototype.clear = function()
{
// TODO: fields?
this.clearUsers();
this.clearUserMasters();
this.clearFieldGroups();
this.clearFieldMasters();
};
CDocument.prototype.setDefaultUser = function(userMaster)
{
if (!userMaster || userMaster === this.DefaultUser)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentDefaultUser(this, this.DefaultUser.GetId(), userMaster.GetId()));
this.DefaultUser = userMaster;
};
CDocument.prototype.setAuthor = function(author)
{
if (this.Author === author)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentAuthor(this, this.Author, author));
this.Author = author;
};
CDocument.prototype.getAuthor = function()
{
return this.Author;
};
CDocument.prototype.setDate = function(date)
{
if (this.Date === date)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentDate(this, this.Date, date));
this.Date = date;
};
CDocument.prototype.getDate = function()
{
return this.Date;
};
CDocument.prototype.setDescription = function(description)
{
if (this.Description === description)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentDescription(this, this.Description, description));
this.Description = description;
};
CDocument.prototype.getDescription = function()
{
return this.Description;
};
CDocument.prototype.setType = function(type)
{
if (this.Type === type)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentType(this, this.Type, type));
this.Type = type;
};
CDocument.prototype.getType = function()
{
return this.Type;
};
CDocument.prototype.setApplication = function(app)
{
if (this.Application === app)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentApplication(this, this.Application, app));
this.Application = app;
};
CDocument.prototype.getApplication = function()
{
return this.Application;
};
CDocument.prototype.setDocumentId = function(documentId)
{
if (this.DocumentId === documentId)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentDocumentId(this, this.DocumentId, documentId));
this.DocumentId = documentId;
};
CDocument.prototype.getDocumentId = function()
{
return this.DocumentId;
};
CDocument.prototype.setFinal = function(isFinal)
{
if (this.Final === isFinal)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentFinal(this, this.Final, isFinal));
this.Final = isFinal;
this.onChangeFinal();
};
CDocument.prototype.isFinal = function()
{
return this.Final;
};
CDocument.prototype.addFieldGroup = function(fieldGroup)
{
if (-1 !== this.FieldGroups.indexOf(fieldGroup))
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentFieldGroup(this, fieldGroup.GetId(), true));
this.FieldGroups.push(fieldGroup);
fieldGroup.setParent(this);
this.onChangeFieldGroups();
};
CDocument.prototype.removeFieldGroup = function(fieldGroup)
{
if (!fieldGroup)
return;
let index = this.FieldGroups.indexOf(fieldGroup);
if (-1 === index)
return;
fieldGroup.setParent(null);
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentFieldGroup(this, fieldGroup.GetId(), false));
this.FieldGroups.splice(index, 1);
this.onChangeFieldGroups();
};
CDocument.prototype.clearFieldGroups = function()
{
while (this.FieldGroups.length)
{
this.removeFieldGroup(this.FieldGroups[0]);
}
};
CDocument.prototype.getFieldGroupsCount = function()
{
return this.FieldGroups.length;
};
CDocument.prototype.getFieldGroup = function(index)
{
if (index < 0 || index >= this.FieldGroups.length)
return null;
return this.FieldGroups[index];
};
CDocument.prototype.fromPkg = function(xmlPkg, opt_sdtPrWithFieldPath)
{
let xmlContext = xmlPkg.getContext();
let mainPart = xmlPkg.getMainPart();
let mainContent = mainPart ? mainPart.getDocumentContent() : null;
if (mainContent)
{
let xmlParserContext = new AscCommon.XmlParserContext();
xmlParserContext.setOformContext(xmlContext);
let reader = new AscCommon.StaxParser(mainContent, mainPart, xmlParserContext);
this.fromXml(reader);
}
let document = this;
xmlContext.getAllUsers().forEach(function(user)
{
document.addUser(user)
});
xmlContext.getAllUserMasters().forEach(function(userMaster)
{
document.addUserMaster(userMaster);
});
xmlContext.getAllFieldMasters().forEach(function(fieldMaster)
{
document.addFieldMaster(fieldMaster);
});
//todo unite with XmlParserContext.prototype.assignFieldsToSdt
if (opt_sdtPrWithFieldPath) {
for (let nSdt = 0; nSdt < opt_sdtPrWithFieldPath.length; ++nSdt) {
let oPair = opt_sdtPrWithFieldPath[nSdt];
// let oFieldMaster = xmlContext.pathToFieldMaster[oPair.target];
let oFieldMaster = xmlContext.getFieldMaster(oPair.target);
if (oFieldMaster && oPair.sdt.SetFieldMaster) {
oPair.sdt.SetFieldMaster(oFieldMaster);
}
}
}
};
CDocument.prototype.toPkg = function(xmlPkg, opt_fieldMastersPartMap)
{
let xmlContext = xmlPkg.getContext();
let xmlWriter = xmlPkg.getXmlWriter();
let main = xmlPkg.addPart(AscCommon.openXml.Types.oformMain).part;
xmlWriter.Seek(0);
main.setDataXml(this, xmlWriter);
this.Users.forEach(function(user)
{
if (!xmlContext.haveUserPart(user))
{
xmlWriter.Seek(0);
let part = xmlPkg.addPart(AscCommon.openXml.Types.oformUser);
if (part)
part.part.setDataXml(user, xmlWriter);
}
});
this.UserMasters.forEach(function(userMaster)
{
if (!xmlContext.haveUserMasterPart(userMaster))
{
xmlWriter.Seek(0);
let part = xmlPkg.addPart(AscCommon.openXml.Types.oformUserMaster);
if (part)
part.part.setDataXml(userMaster, xmlWriter);
}
});
this.FieldMasters.forEach(function(fieldMaster)
{
if (!xmlContext.haveFieldMasterPart(fieldMaster))
{
xmlWriter.Seek(0);
let part = xmlPkg.addPart(AscCommon.openXml.Types.oformFieldMaster);
if (part)
{
part.part.setDataXml(fieldMaster, xmlWriter);
if (opt_fieldMastersPartMap)
{
//todo remove path manipulation
opt_fieldMastersPartMap[fieldMaster.Id] = '..'+part.part.uri;
}
}
}
});
};
CDocument.prototype.fromXml = function(reader)
{
this.clear();
// TODO: Author, Date
if (!reader.ReadNextNode() || "document" !== reader.GetNameNoNS())
return false;
let depth = reader.GetDepth();
while (reader.ReadNextSiblingNode(depth))
{
switch(reader.GetNameNoNS())
{
case "author":
break;
case "date":
break;
case "description":
this.setDescription(reader.GetTextDecodeXml());
break;
case "final":
this.setFinal(reader.GetTextBool());
break
case "type":
this.setType(reader.GetTextDecodeXml());
break;
case "application":
this.setApplication(reader.GetTextDecodeXml());
break;
case "id":
this.setDocumentId(reader.GetTextDecodeXml());
break;
case "fieldGroup":
this.addFieldGroup(AscOForm.CFieldGroup.fromXml(reader));
break;
case "defaultUser":
{
while (reader.MoveToNextAttribute())
{
if ("r:id" === reader.GetName())
{
let xmlReaderContext = reader.GetOformContext();
let rId = reader.GetValueDecodeXml();
let rel = reader.rels.getRelationship(rId);
let userMaster = xmlReaderContext.getUserMaster(rel.getFullPath());
if (userMaster)
this.setDefaultUser(userMaster);
}
}
break;
}
}
}
return true;
};
CDocument.prototype.toXml = function(writer)
{
writer.WriteXmlHeader();
writer.WriteXmlNodeStart("document");
writer.WriteXmlRelationshipsNS();
writer.WriteXmlAttributesEnd();
// TODO: Author, Date
let description = this.getDescription();
if (description)
writer.WriteXmlNodeWithText("description", description);
let type = this.getType();
if (type)
writer.WriteXmlNodeWithText("type", type);
let application = this.getApplication();
if (application)
writer.WriteXmlNodeWithText("application", application);
if (this.isFinal())
writer.WriteXmlNodeWithText("final", "1");
let documentId = this.getDocumentId();
if (documentId)
writer.WriteXmlNodeWithText("id", documentId);
let xmlContext = writer.context;
let defaultUserPart = xmlContext.getDefaultUserMasterPart(this.DefaultUser);
if (defaultUserPart)
{
writer.WriteXmlNodeStart("defaultUser");
writer.WriteXmlNullableAttributeString("r:id", xmlContext.getRId(defaultUserPart));
writer.WriteXmlAttributesEnd(true);
}
for (let fgIndex = 0, fgCount = this.FieldGroups.length; fgIndex < fgCount; ++fgIndex)
{
this.FieldGroups[fgIndex].toXml(writer);
}
writer.WriteXmlNodeEnd("document");
};
/**
* @returns {AscOForm.CUserMaster}
*/
CDocument.prototype.getDefaultUserMaster = function()
{
return this.DefaultUser;
};
CDocument.prototype.addUser = function(user)
{
if (-1 !== this.Users.indexOf(user))
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentUser(this, user.GetId(), true));
this.Users.push(user);
};
CDocument.prototype.removeUser = function(user)
{
let index = this.Users.indexOf(user);
if (-1 === index)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentUser(this, user.GetId(), false));
this.Users.splice(index, 1);
};
CDocument.prototype.getUserCount = function()
{
return this.Users.length;
};
/**
* @param index {number}
* @returns {?AscOForm.CUser}
*/
CDocument.prototype.getUser = function(index)
{
if (index < 0 || index >= this.Users.length)
return null;
return this.Users[index];
};
CDocument.prototype.clearUsers = function()
{
while (this.Users.length)
{
this.removeUser(this.Users[0]);
}
};
CDocument.prototype.addUserMaster = function(userMaster)
{
if (-1 !== this.UserMasters.indexOf(userMaster))
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentUserMaster(this, userMaster.GetId(), true));
this.UserMasters.push(userMaster);
userMaster.setParent(this);
};
CDocument.prototype.removeUserMaster = function(userMaster)
{
let index = this.UserMasters.indexOf(userMaster);
if (-1 === index)
return;
userMaster.setParent(null);
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentUserMaster(this, userMaster.GetId(), false));
this.UserMasters.splice(index, 1);
};
CDocument.prototype.getUserMasterCount = function()
{
return this.UserMasters.length;
};
CDocument.prototype.getUserMaster = function(index)
{
if (index < 0 || index >= this.UserMasters.length)
return null;
return this.UserMasters[index];
};
CDocument.prototype.getAllUserMasters = function()
{
return this.UserMasters;
};
CDocument.prototype.clearUserMasters = function()
{
while (this.UserMasters.length)
{
this.removeUserMaster(this.UserMasters[0]);
}
};
CDocument.prototype.createFieldMaster = function(id)
{
let fieldMaster = new AscOForm.CFieldMaster(!id);
if (id)
fieldMaster.setFieldId(id);
this.addFieldMaster(fieldMaster);
return fieldMaster;
};
CDocument.prototype.addFieldMaster = function(fieldMaster)
{
if (-1 !== this.FieldMasters.indexOf(fieldMaster))
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentFieldMaster(this, fieldMaster.GetId(), true));
this.FieldMasters.push(fieldMaster);
};
CDocument.prototype.removeFieldMaster = function(fieldMaster)
{
let index = this.FieldMasters.indexOf(fieldMaster);
if (-1 === index)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentFieldMaster(this, fieldMaster.GetId(), false));
this.FieldMasters.splice(index, 1);
};
CDocument.prototype.removeFieldMasterByIndex = function(index)
{
if (index < 0 || index >= this.FieldMasters.length)
return;
let fieldMaster = this.FieldMasters[index];
AscCommon.History.Add(new AscDFH.CChangesOFormDocumentFieldMaster(this, fieldMaster.GetId(), false));
this.FieldMasters.splice(index, 1);
};
CDocument.prototype.getFieldMasterCount = function()
{
return this.FieldMasters.length;
};
CDocument.prototype.getFieldMaster = function(index)
{
if (index < 0 || index >= this.FieldMasters.length)
return null;
return this.FieldMasters[index];
};
CDocument.prototype.clearFieldMasters = function()
{
while (this.FieldMasters.length)
{
this.removeFieldMaster(this.FieldMasters[0]);
}
};
CDocument.prototype.getMinWeight = function()
{
let min = -1;
for (let index = 0, count = this.FieldGroups.length; index < count; ++index)
{
let curWeight = this.FieldGroups[index].getWeight();
if (-1 === min || min > curWeight)
min = curWeight;
}
return min;
};
CDocument.prototype.getMaxWeight = function()
{
let max = -1;
for (let index = 0, count = this.FieldGroups.length; index < count; ++index)
{
let curWeight = this.FieldGroups[index].getWeight();
if (max < curWeight)
max = curWeight;
}
return max;
};
CDocument.prototype.getAllFieldsByUserMaster = function(userMaster)
{
let fields = [];
for (let index = 0, count = this.FieldMasters.length; index < count; ++index)
{
let fieldMaster = this.FieldMasters[index];
if (fieldMaster.checkUser(userMaster))
fields.push(fieldMaster);
}
return fields;
};
CDocument.prototype.onChangeFieldGroups = function()
{
if (!this.OForm)
return;
this.OForm.onChangeRoles();
};
CDocument.prototype.onChangeFieldGroup = function(fieldGroup)
{
if (!this.OForm)
return;
this.OForm.onChangeRoles();
};
CDocument.prototype.onChangeFieldGroupFilled = function(fieldGroup)
{
if (!this.OForm)
return;
this.OForm.onChangeFieldGroupFilled(fieldGroup);
};
CDocument.prototype.onChangeUserMaster = function(userMaster)
{
if (!this.OForm)
return;
this.OForm.onChangeRoles();
this.OForm.onChangeRoleColor();
};
CDocument.prototype.correctFieldMasters = function(logicDocument)
{
if (!logicDocument)
return;
let formManager = logicDocument.GetFormsManager();
let allForms = formManager.GetAllForms();
for (let index = 0, count = allForms.length; index < count; ++index)
{
let form = allForms[index];
let fieldMaster = form.GetFieldMaster();
if (!fieldMaster)
{
// TODO: We cannot generate id here because this function is called on document open
// and then different clients would have different ids. So for now, it's better to leave such fields without id
fieldMaster = new AscOForm.CFieldMaster(false);
this.addFieldMaster(fieldMaster);
fieldMaster.addUser(this.getDefaultUserMaster());
form.SetFieldMaster(fieldMaster);
}
fieldMaster.setLogicField(form);
}
for (let fieldIndex = this.FieldMasters.length - 1; fieldIndex >= 0; --fieldIndex)
{
let fieldMaster = this.FieldMasters[fieldIndex];
let form = fieldMaster.getLogicField();
if (!form || form.GetFieldMaster() !== fieldMaster)
this.removeFieldMasterByIndex(fieldIndex);
}
};
CDocument.prototype.removeUnusedFieldMasters = function()
{
for (let fieldIndex = this.FieldMasters.length - 1; fieldIndex >= 0; --fieldIndex)
{
let fieldMaster = this.FieldMasters[fieldIndex];
if (!fieldMaster.isUseInDocument())
this.removeFieldMasterByIndex(fieldIndex);
}
};
CDocument.prototype.onChangeFinal = function()
{
if (!this.OForm)
return;
this.OForm.sendEvent("asc_onOFormChangeFinal", this.isFinal());
};
//--------------------------------------------------------export----------------------------------------------------
AscOForm.CDocument = CDocument;
})(window);

342
oform/format/FieldGroup.js Normal file
View File

@ -0,0 +1,342 @@
/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function(window)
{
/**
* @constructor
* @extends AscOForm.CBaseFormatObject
*/
function CFieldGroup()
{
AscOForm.CBaseFormatObject.call(this);
this.Filled = false;
this.Date = undefined;
this.Weight = null;
this.Fields = [];
this.Users = [];
this.Parent = null;
}
AscFormat.InitClass(CFieldGroup, AscOForm.CBaseFormatObject, AscDFH.historyitem_type_OForm_FieldGroup);
CFieldGroup.prototype.setParent = function(parent)
{
if (this.Parent === parent)
return;
this.Parent = parent;
this.onChange();
};
CFieldGroup.prototype.isFilled = function()
{
return !!this.Filled;
};
CFieldGroup.prototype.setFilled = function(isFilled)
{
if (this.Filled === isFilled)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldGroupFilled(this, this.Filled, isFilled));
this.Filled = isFilled;
this.onChangeFilled();
};
CFieldGroup.prototype.setWeight = function(value)
{
if (this.Weight === value)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldGroupWeight(this, this.Weight, value));
this.Weight = value;
this.onChange();
};
CFieldGroup.prototype.getWeight = function()
{
return this.Weight;
};
CFieldGroup.prototype.setDate = function(date)
{
if (date === this.Date)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldGroupDate(this, this.Date, date));
this.Date = date;
};
CFieldGroup.prototype.getDate = function()
{
return this.Date;
};
CFieldGroup.prototype.addField = function(field)
{
if (!field || -1 !== this.Fields.indexOf(field))
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldGroupAddRemoveField(this, field.GetId(), true));
this.Fields.push(field);
this.onChange();
};
CFieldGroup.prototype.removeField = function(field)
{
if (!field)
return;
let index = this.Fields.indexOf(field);
if (-1 === index)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldGroupAddRemoveField(this, field.GetId(), false));
this.Fields.splice(index, 1);
this.onChange();
};
CFieldGroup.prototype.getFieldCount = function()
{
return this.Fields.length;
};
CFieldGroup.prototype.getField = function(index)
{
return (index >= 0 && index < this.Fields.length ? this.Fields[index] : null);
};
CFieldGroup.prototype.addUser = function(user)
{
if (!user || -1 !== this.Users.indexOf(user))
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldGroupAddRemoveUser(this, user.GetId(), true));
this.Users.push(user);
this.onChange();
};
CFieldGroup.prototype.removeUser = function(user)
{
if (!user)
return;
let index = this.Users.indexOf(user);
if (-1 === index)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldGroupAddRemoveUser(this, user.GetId(), false));
this.Users.splice(index, 1);
this.onChange();
};
CFieldGroup.prototype.getUserCount = function()
{
return this.Users.length;
};
CFieldGroup.prototype.getUser = function(index)
{
return (index >= 0 && index < this.Users.length ? this.Users[index] : null);
};
CFieldGroup.prototype.clear = function()
{
while (this.Users.length)
{
this.removeUser(this.Users[this.Users.length - 1]);
}
while (this.Fields.length)
{
this.removeField(this.Fields[this.Fields.length - 1]);
}
};
CFieldGroup.prototype.onChange = function()
{
if (!this.Parent)
return;
this.Parent.onChangeFieldGroup(this);
};
CFieldGroup.prototype.onChangeFilled = function()
{
if (!this.Parent)
return;
this.Parent.onChangeFieldGroupFilled(this);
};
CFieldGroup.prototype.getAllFields = function()
{
let fields = [];
for (let fieldIndex = 0, fieldCount = this.Fields.length; fieldIndex < fieldCount; ++fieldIndex)
{
if (this.Fields[fieldIndex].isUseInDocument()
&& this.Fields[fieldIndex].isMainField())
{
fields.push(this.Fields[fieldIndex]);
}
}
if (this.Users.length && this.Parent)
{
for (let index = 0, count = this.Users.length; index < count; ++index)
{
let userFields = this.Parent.getAllFieldsByUserMaster(this.Users[index]);
for (let fieldIndex = 0, fieldCount = userFields.length; fieldIndex < fieldCount; ++fieldIndex)
{
if (-1 === fields.indexOf(userFields[fieldIndex])
&& userFields[fieldIndex].isUseInDocument()
&& userFields[fieldIndex].isMainField())
{
fields.push(userFields[fieldIndex]);
}
}
}
}
return fields;
};
CFieldGroup.prototype.getFirstUser = function()
{
let user = null;
for (let index = 0, userCount = this.Users.length; index < userCount; ++index)
{
let curUser = this.Users[index];
if (!user || user.compare(curUser) < 0)
user = curUser;
}
if (!user)
{
for (let fieldIndex = 0, fieldCount = this.Fields.length; fieldIndex < fieldCount; ++fieldIndex)
{
let curUser = this.Fields[fieldIndex].getFirstUser();
if (!user || user.compare(curUser) < 0)
user = curUser;
}
}
return user;
};
CFieldGroup.prototype.toXml = function(writer)
{
let context = writer.context;
writer.WriteXmlNodeStart("fieldGroup");
writer.WriteXmlNullableAttributeInt("weight", this.getWeight());
if (this.isFilled())
writer.WriteXmlNullableAttributeBool("filled", true);
if (this.Date)
{
let dateUtc = new Date(this.Date).toISOString().slice(0, 19) + 'Z';
writer.WriteXmlNullableAttributeString("date", dateUtc);
}
writer.WriteXmlAttributesEnd();
for (let userIndex = 0, userCount = this.Users.length; userIndex < userCount; ++userIndex)
{
let part = context.getUserMasterPart(this.Users[userIndex]);
if (!part)
continue;
writer.WriteXmlNodeStart("user");
writer.WriteXmlNullableAttributeString("r:id", context.getRId(part));
writer.WriteXmlAttributesEnd(true);
}
for (let fieldIndex = 0, fieldCount = this.Fields.length; fieldIndex < fieldCount; ++fieldIndex)
{
let part = context.getFieldMasterPart(this.Fields[fieldIndex]);
if (!part)
continue;
writer.WriteXmlNodeStart("field");
writer.WriteXmlNullableAttributeString("r:id", context.getRId(part));
writer.WriteXmlAttributesEnd(true);
}
writer.WriteXmlNodeEnd("fieldGroup");
};
CFieldGroup.fromXml = function(reader)
{
let fG = new CFieldGroup();
while (reader.MoveToNextAttribute())
{
let attrName = reader.GetNameNoNS();
if ("weight" === attrName)
fG.setWeight(reader.GetValueInt());
else if ("filled" === attrName)
fG.setFilled(reader.GetValueBool());
else if ("date" === attrName)
{
let date = AscCommon.getTimeISO8601(reader.GetValueDecodeXml());
if (!isNaN(date))
fG.setDate(date);
}
}
let xmlReaderContext = reader.GetOformContext();
let depth = reader.GetDepth();
while (reader.ReadNextSiblingNode(depth))
{
switch(reader.GetNameNoNS())
{
case "user":
while (reader.MoveToNextAttribute())
{
if ("r:id" === reader.GetName())
{
let rId = reader.GetValueDecodeXml();
let rel = reader.rels.getRelationship(rId);
let userMaster = xmlReaderContext && xmlReaderContext.getUserMaster(rel.getFullPath());
if (userMaster)
fG.addUser(userMaster);
}
}
break;
case "field":
while (reader.MoveToNextAttribute())
{
if ("r:id" === reader.GetName())
{
let rId = reader.GetValueDecodeXml();
let rel = reader.rels.getRelationship(rId);
let fieldMaster = xmlReaderContext && xmlReaderContext.getFieldMaster(rel.getFullPath());
if (fieldMaster)
fG.addField(fieldMaster);
}
}
break;
}
}
return fG;
};
//--------------------------------------------------------export----------------------------------------------------
AscOForm.CFieldGroup = CFieldGroup;
})(window);

303
oform/format/FieldMaster.js Normal file
View File

@ -0,0 +1,303 @@
/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function(window)
{
/**
* @param {boolean} [generateId=false]
* @constructor
* @extends AscOForm.CBaseFormatObject
*/
function CFieldMaster(generateId)
{
AscOForm.CBaseFormatObject.call(this);
this.FieldId = null;
this.Field = null;
this.Users = [];
this.Signers = [];
if (true === generateId)
this.setFieldId(AscCommon.CreateGUID());
}
AscFormat.InitClass(CFieldMaster, AscOForm.CBaseFormatObject, AscDFH.historyitem_type_OForm_FieldMaster);
CFieldMaster.prototype.setLogicField = function(logicField)
{
this.Field = logicField;
};
CFieldMaster.prototype.getLogicField = function()
{
return this.Field;
};
CFieldMaster.prototype.clone = function()
{
let fm = new CFieldMaster(true);
this.copyTo(fm);
return fm;
};
CFieldMaster.prototype.copyTo = function(fm)
{
fm.clearUsers();
for (let index = 0, count = this.Users.length; index < count; ++index)
{
fm.addUser(this.Users[index]);
}
fm.clearSigners();
for (let index = 0, count = this.Signers.length; index < count; ++index)
{
fm.addSigner(this.Signers[index]);
}
};
CFieldMaster.prototype.setFieldId = function(fieldId)
{
if (fieldId === this.FieldId)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldMasterFieldId(this, this.FieldId, fieldId));
this.FieldId = fieldId;
};
CFieldMaster.prototype.getFieldId = function()
{
return this.FieldId;
};
CFieldMaster.prototype.addUser = function(user)
{
if (-1 !== this.Users.indexOf(user))
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldMasterAddRemoveUser(this, user.GetId(), true));
this.Users.push(user);
};
CFieldMaster.prototype.removeUser = function(user)
{
let index = this.Users.indexOf(user);
if (-1 === index)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldMasterAddRemoveUser(this, user.GetId(), false));
this.Users.splice(index, 1);
};
CFieldMaster.prototype.clearUsers = function()
{
while (this.Users.length)
{
this.removeUser(this.Users[this.Users.length - 1]);
}
};
CFieldMaster.prototype.getUserCount = function()
{
return this.Users.length;
};
CFieldMaster.prototype.getUser = function(index)
{
if (index < 0 || index >= this.Users.length)
return null;
return this.Users[index];
};
CFieldMaster.prototype.getFirstUser = function()
{
let user = null;
for (let userIndex = 0, userCount = this.getUserCount(); userIndex < userCount; ++userIndex)
{
let curUser = this.getUser(userIndex);
if (!user || user.compare(curUser) < 0)
user = curUser;
}
return user;
};
CFieldMaster.prototype.addSigner = function(user)
{
if (-1 !== this.Signers.indexOf(user))
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldMasterAddRemoveSigner(this, user.GetId(), true));
this.Signers.push(user);
};
CFieldMaster.prototype.removeSigner = function(user)
{
let index = this.Signers.indexOf(user);
if (-1 === index)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormFieldMasterAddRemoveSigner(this, user.GetId(), false));
this.Signers.splice(index, 1);
};
CFieldMaster.prototype.clearSigners = function()
{
while (this.Signers.length)
{
this.removeSigner(this.Signers[this.Signers.length - 1]);
}
};
CFieldMaster.prototype.checkUser = function(user)
{
for (let index = 0, count = this.Users.length; index < count; ++index)
{
if (this.Users[index] === user)
return true;
}
return false;
};
CFieldMaster.prototype.isUseInDocument = function()
{
return (this.Field
&& this.Field.IsUseInDocument()
&& this === this.Field.GetFieldMaster());
};
CFieldMaster.prototype.isMainField = function()
{
return (this.Field && this.Field.IsMainForm());
};
CFieldMaster.prototype.toXml = function(writer)
{
let context = writer.context;
writer.WriteXmlHeader();
writer.WriteXmlNodeStart("fieldMaster");
writer.WriteXmlRelationshipsNS();
if (this.FieldId)
writer.WriteXmlNullableAttributeString("id", this.FieldId);
writer.WriteXmlAttributesEnd();
writer.WriteXmlNodeStart("users");
writer.WriteXmlAttributesEnd();
for (let index = 0, count = this.Users.length; index < count; ++index)
{
let user = this.Users[index];
let part = context.getUserMasterPart(user);
if (!part)
continue;
writer.WriteXmlNodeStart("user");
writer.WriteXmlNullableAttributeString("r:id", context.getRId(part));
writer.WriteXmlAttributesEnd(true);
}
writer.WriteXmlNodeEnd("users");
writer.WriteXmlNodeStart("signRequest");
writer.WriteXmlAttributesEnd();
for (let index = 0, count = this.Signers.length; index < count; ++index)
{
let user = this.Signers[index];
let part = context.getUserMasterPart(user);
if (!part)
continue;
writer.WriteXmlNodeStart("user");
writer.WriteXmlNullableAttributeString("r:id", context.getRId(part));
writer.WriteXmlAttributesEnd(true);
}
writer.WriteXmlNodeEnd("signRequest");
writer.WriteXmlNodeEnd("fieldMaster");
};
CFieldMaster.fromXml = function(reader)
{
if (!reader.ReadNextNode())
return null;
if ("fieldMaster" !== reader.GetNameNoNS())
return null;
let fieldMaster = new CFieldMaster();
while (reader.MoveToNextAttribute())
{
if ("id" === reader.GetNameNoNS())
fieldMaster.setFieldId(reader.GetValueDecodeXml());
}
let depth = reader.GetDepth();
while (reader.ReadNextSiblingNode(depth))
{
switch(reader.GetNameNoNS())
{
case "users":
{
let users = readUsersFromXml(reader);
for (let index = 0, count = users.length; index < count; ++index)
{
fieldMaster.addUser(users[index]);
}
break;
}
case "signRequest":
{
let users = readUsersFromXml(reader);
for (let index = 0, count = users.length; index < count; ++index)
{
fieldMaster.addSigner(users[index]);
}
break;
}
}
}
return fieldMaster;
};
function readUsersFromXml(reader)
{
let xmlReaderContext = reader.GetOformContext();
let users = [];
let depth = reader.GetDepth();
while (reader.ReadNextSiblingNode(depth))
{
if ("user" === reader.GetNameNoNS())
{
while (reader.MoveToNextAttribute())
{
if ("r:id" === reader.GetName())
{
let rId = reader.GetValueDecodeXml();
let rel = reader.rels.getRelationship(rId);
let userMaster = xmlReaderContext && xmlReaderContext.getUserMaster(rel.getFullPath());
if (userMaster)
users.push(userMaster);
}
}
}
}
return users;
}
//--------------------------------------------------------export----------------------------------------------------
AscOForm.CFieldMaster = CFieldMaster;
})(window);

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
@ -12,7 +12,7 @@
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
@ -37,10 +37,11 @@
/**
* @param {AscOForm.CUserMaster} userMaster
* @constructor
* @extends AscOForm.CBaseFormatObject
*/
function CUser(userMaster)
{
AscFormat.CBaseFormatObject.call(this);
AscOForm.CBaseFormatObject.call(this);
this.Email = undefined;
this.Telephone = undefined;
@ -49,7 +50,7 @@
if (userMaster)
this.setUserMaster(userMaster);
}
AscFormat.InitClass(CUser, AscFormat.CBaseFormatObject, AscDFH.historyitem_type_OForm_User);
AscFormat.InitClass(CUser, AscOForm.CBaseFormatObject, AscDFH.historyitem_type_OForm_User);
CUser.prototype.setUserMaster = function(userMaster)
{
if (this.UserMaster === userMaster)
@ -81,36 +82,45 @@
{
return this.UserMaster;
};
CUser.prototype.readChildXml = function(name, reader)
{
let bRead = false;
switch (name)
{
case "Email":
{
let node = CT_XmlNode.fromReader(reader);
this.setEmail(node.text);
bRead = true;
break;
}
case "Telephone":
{
let node = CT_XmlNode.fromReader(reader);
this.setTelephone(node.text);
bRead = true;
break;
}
}
return bRead;
};
CUser.prototype.toXml = function(writer)
{
writer.WriteXmlString(AscCommonWord.g_sXmlHeader);
writer.WriteXmlNodeStart("User");
writer.WriteXmlHeader();
writer.WriteXmlNodeStart("user");
writer.WriteXmlAttributesEnd();
writer.WriteXmlNodeWithText("Email", this.Email);
writer.WriteXmlNodeWithText("Telephone", this.Telephone);
writer.WriteXmlNodeEnd("User");
if (this.Email)
writer.WriteXmlNodeWithText("email", this.Email);
if (this.Telephone)
writer.WriteXmlNodeWithText("telephone", this.Telephone);
writer.WriteXmlNodeEnd("user");
};
CUser.fromXml = function(reader)
{
if (!reader.ReadNextNode())
return null;
let name = reader.GetNameNoNS();
if ("user" !== reader.GetNameNoNS())
return null;
let user = new CUser();
let depth = reader.GetDepth();
while (reader.ReadNextSiblingNode(depth))
{
name = reader.GetNameNoNS();
switch(reader.GetNameNoNS())
{
case "email":
user.setEmail(reader.GetTextDecodeXml());
break;
case "telephone":
user.setTelephone(reader.GetTextDecodeXml());
break;
}
}
return user;
};
//--------------------------------------------------------export----------------------------------------------------
AscOForm.CUser = CUser;

295
oform/format/UserMaster.js Normal file
View File

@ -0,0 +1,295 @@
/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function(window)
{
let noRole = null;
function getNoRole()
{
if (!noRole)
{
noRole = AscCommon.ExecuteNoHistory(function()
{
let user = new CUserMaster();
user.setUserId("{BA186350-BB64-8503-5C55-083595AB15A9}");
user.setRole("NoRole");
return user;
});
}
return noRole;
}
/**
* @param {boolean} [generateId=false]
* @constructor
* @extends AscOForm.CBaseFormatObject
*/
function CUserMaster(generateId)
{
AscOForm.CBaseFormatObject.call(this);
this.UserId = undefined;
this.UserName = undefined;
this.UserEmail = undefined;
this.Role = undefined;
this.Color = undefined;
if (true === generateId)
this.setUserId(AscCommon.CreateGUID());
this.Parent = null;
}
AscFormat.InitClass(CUserMaster, AscOForm.CBaseFormatObject, AscDFH.historyitem_type_OForm_UserMaster);
CUserMaster.prototype.setParent = function(parent)
{
if (this.Parent === parent)
return;
this.Parent = parent;
this.onChange();
};
CUserMaster.prototype.setUserId = function(userId)
{
if (userId === this.UserId)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormUserMasterUserId(this, this.UserId, userId));
this.UserId = userId;
this.onChange();
};
CUserMaster.prototype.getUserId = function()
{
return this.UserId;
};
CUserMaster.prototype.setUserName = function(userName)
{
if (userName === this.UserName)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormUserMasterUserName(this, this.UserName, userName));
this.UserName = userName;
this.onChange();
};
CUserMaster.prototype.getUserName = function()
{
return this.UserName;
};
CUserMaster.prototype.setUserEmail = function(userEmail)
{
if (userEmail === this.UserEmail)
return;
AscCommon.History.Add(new AscDFH.CChangesOFormUserMasterUserEmail(this, this.UserEmail, userEmail));
this.UserEmail = userEmail;
this.onChange();
};
CUserMaster.prototype.getUserEmail = function()
{
return this.UserEmail;
};
CUserMaster.prototype.setRole = function(role)
{
if (role === this.Role)
return;
role = null === role ? undefined : role;
AscCommon.History.Add(new AscDFH.CChangesOFormUserMasterRole(this, this.Role, role));
this.Role = role;
this.onChange();
};
CUserMaster.prototype.getRole = function()
{
return this.Role ? this.Role : "";
};
CUserMaster.prototype.isNoRole = function()
{
return (this === AscOForm.getNoRole());
};
CUserMaster.prototype.setColor = function(r, g, b)
{
let newColor = undefined !== r && null !== r ? new AscWord.CDocumentColor(r, g, b) : undefined;
let oldColor = this.Color;
if ((!newColor && !oldColor) || (oldColor && oldColor.IsEqual(newColor)))
return;
AscCommon.History.Add(new AscDFH.CChangesOFormUserMasterColor(this, oldColor, newColor));
this.Color = newColor;
this.onChange();
};
CUserMaster.prototype.getColor = function()
{
return this.Color ? this.Color : null;
};
CUserMaster.prototype.initDefaultUser = function()
{
// TODO: Consider creating a unique id common for the default role
this.setRole("Anyone");
this.setColor(255, 239, 191);
};
CUserMaster.prototype.compare = function(user)
{
let res = AscCommon.CompareStrings(this.Role, user.Role);
if (0 !== res)
return res;
res = AscCommon.CompareStrings(this.UserId, user.UserId);
if (0 !== res)
return res;
if (!this.Color && !user.Color)
return 0;
else if (!this.Color && user.Color)
return -1;
else if (this.Color && !user.Color)
return 1;
if (this.Color.r < user.Color.r)
return -1;
else if (this.Color.r > user.Color.r)
return 1;
else if (this.Color.g < user.Color.g)
return -1;
else if (this.Color.g > user.Color.g)
return 1;
else if (this.Color.b < user.Color.b)
return -1;
else if (this.Color.b > user.Color.b)
return 1;
return 0;
};
CUserMaster.prototype.isEqual = function(user)
{
return (0 === this.compare(user));
};
CUserMaster.prototype.isDefaultUserProps = function()
{
let result = false;
let u = this;
AscCommon.ExecuteNoHistory(function()
{
let defaultUser = new CUserMaster();
defaultUser.initDefaultUser();
result = defaultUser.isEqual(u);
});
return result;
};
CUserMaster.prototype.onChange = function()
{
if (!this.Parent)
return;
this.Parent.onChangeUserMaster(this);
};
CUserMaster.prototype.toXml = function(writer)
{
writer.WriteXmlHeader();
writer.WriteXmlNodeStart("user");
writer.WriteXmlAttributesEnd();
if (this.UserId)
writer.WriteXmlNodeWithText("id", this.UserId);
if (this.UserName)
writer.WriteXmlNodeWithText("name", this.UserName);
if (this.UserEmail)
writer.WriteXmlNodeWithText("email", this.UserEmail);
if (this.Role)
writer.WriteXmlNodeWithText("role", this.Role);
if (this.Color)
{
writer.WriteXmlNodeStart("color");
writer.WriteXmlNullableAttributeStringEncode("val", this.Color.ToHexColor());
writer.WriteXmlAttributesEnd(true);
}
writer.WriteXmlNodeEnd("user");
};
CUserMaster.fromXml = function(reader)
{
if (!reader.ReadNextNode())
return null;
let name = reader.GetNameNoNS();
if ("user" !== reader.GetNameNoNS())
return null;
let um = new CUserMaster();
let depth = reader.GetDepth();
while (reader.ReadNextSiblingNode(depth))
{
name = reader.GetNameNoNS();
switch(reader.GetNameNoNS())
{
case "id":
um.setUserId(reader.GetTextDecodeXml());
break;
case "name":
um.setUserName(reader.GetTextDecodeXml());
break;
case "email":
um.setUserEmail(reader.GetTextDecodeXml());
break;
case "role":
um.setRole(reader.GetTextDecodeXml());
break;
case "color":
while (reader.MoveToNextAttribute())
{
if ("val" === reader.GetNameNoNS())
{
let color = new AscWord.CDocumentColor();
color.SetFromHexColor(reader.GetValueDecodeXml());
um.setColor(color.r, color.g, color.b);
}
}
reader.ReadTillEnd();
break;
}
}
return um;
};
//--------------------------------------------------------export----------------------------------------------------
AscOForm.CUserMaster = CUserMaster;
AscOForm.getNoRole = getNoRole;
})(window);

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
@ -12,7 +12,7 @@
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
@ -35,8 +35,7 @@
(function(window)
{
/**
* Базовое изменение для работы с каким-либо контейнером, в который по ключу-key (string)
* добавляют/удаляют значение
* Base change for working with a container where values are added/removed by string key
* @constructor
* @extends {window['AscDFH'].CChangesBase}
*/

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
@ -12,7 +12,7 @@
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
@ -41,14 +41,22 @@
window['AscDFH'].historyitem_OForm_Document_Application = window['AscDFH'].historyitem_type_OForm_Document | 5;
window['AscDFH'].historyitem_OForm_Document_DocumentId = window['AscDFH'].historyitem_type_OForm_Document | 6;
window['AscDFH'].historyitem_OForm_Document_FieldGroup = window['AscDFH'].historyitem_type_OForm_Document | 7;
window['AscDFH'].historyitem_OForm_Document_User = window['AscDFH'].historyitem_type_OForm_Document | 8;
window['AscDFH'].historyitem_OForm_Document_UserMaster = window['AscDFH'].historyitem_type_OForm_Document | 9;
window['AscDFH'].historyitem_OForm_Document_FieldMaster = window['AscDFH'].historyitem_type_OForm_Document | 10;
window['AscDFH'].historyitem_OForm_Document_DefaultUser = window['AscDFH'].historyitem_type_OForm_Document | 11;
window['AscDFH'].historyitem_OForm_Document_Final = window['AscDFH'].historyitem_type_OForm_Document | 12;
/**
* @constructor
* @extends {window['AscDFH'].CChangesBaseStringProperty}
*/
function CChangesOFormDocumentAuthor(Class, Old, New)
function CChangesOFormDocumentAuthor(Class, oldAuthor, newAuthor)
{
window['AscDFH'].CChangesBaseStringProperty.call(this, Class, Old, New);
let oldId = oldAuthor ? oldAuthor.GetId() : undefined;
let newId = newAuthor ? newAuthor.GetId() : undefined;
window['AscDFH'].CChangesBaseStringProperty.call(this, Class, oldId, newId);
}
window['AscDFH'].InheritPropertyChange(
CChangesOFormDocumentAuthor,
@ -56,7 +64,16 @@
window['AscDFH'].historyitem_OForm_Document_Author,
function(value)
{
this.Class.Author = value;
if (undefined === value)
{
this.Class.Author = undefined;
}
else
{
let author = AscCommon.g_oTableId.GetById(value);
if (author)
this.Class.Author = value;
}
},
false
);
@ -177,16 +194,158 @@
{
let fieldGroup = AscCommon.g_oTableId.GetById(this.Key);
if (-1 === this.Class.FieldGroups.indexOf(fieldGroup))
{
fieldGroup.setParent(this.Class);
this.Class.FieldGroups.push(fieldGroup);
this.Class.onChangeFieldGroups();
}
},
function()
{
let fieldGroup = AscCommon.g_oTableId.GetById(this.Key);
let index = this.Class.FieldGroups.indexOf(fieldGroup);
if (-1 !== index)
{
fieldGroup.setParent(null);
this.Class.FieldGroups.splice(index, 1);
this.Class.onChangeFieldGroups();
}
}
);
window['AscDFH'].CChangesOFormDocumentFieldGroup = CChangesOFormDocumentFieldGroup;
/**
* @constructor
* @extends {window['AscDFH'].CChangesDictionaryBase}
*/
function CChangesOFormDocumentUser(Class, userId, isAdd)
{
window['AscDFH'].CChangesDictionaryBase.call(this, Class, userId, isAdd);
}
window['AscDFH'].InheritDictionaryChange(
CChangesOFormDocumentUser,
window['AscDFH'].historyitem_OForm_Document_User,
function()
{
let user = AscCommon.g_oTableId.GetById(this.Key);
if (-1 === this.Class.Users.indexOf(user))
this.Class.Users.push(user);
},
function()
{
let user = AscCommon.g_oTableId.GetById(this.Key);
let index = this.Class.Users.indexOf(user);
if (-1 !== index)
this.Class.Users.splice(index, 1);
}
);
window['AscDFH'].CChangesOFormDocumentUser = CChangesOFormDocumentUser;
/**
* @constructor
* @extends {window['AscDFH'].CChangesDictionaryBase}
*/
function CChangesOFormDocumentUserMaster(Class, userMasterId, isAdd)
{
window['AscDFH'].CChangesDictionaryBase.call(this, Class, userMasterId, isAdd);
}
window['AscDFH'].InheritDictionaryChange(
CChangesOFormDocumentUserMaster,
window['AscDFH'].historyitem_OForm_Document_UserMaster,
function()
{
let userMaster = AscCommon.g_oTableId.GetById(this.Key);
if (-1 === this.Class.UserMasters.indexOf(userMaster))
{
userMaster.setParent(this.Class);
this.Class.UserMasters.push(userMaster);
}
},
function()
{
let userMaster = AscCommon.g_oTableId.GetById(this.Key);
let index = this.Class.UserMasters.indexOf(userMaster);
if (-1 !== index)
{
userMaster.setParent(null);
this.Class.UserMasters.splice(index, 1);
}
}
);
window['AscDFH'].CChangesOFormDocumentUserMaster = CChangesOFormDocumentUserMaster;
/**
* @constructor
* @extends {window['AscDFH'].CChangesDictionaryBase}
*/
function CChangesOFormDocumentFieldMaster(Class, fieldMasterId, isAdd)
{
window['AscDFH'].CChangesDictionaryBase.call(this, Class, fieldMasterId, isAdd);
}
window['AscDFH'].InheritDictionaryChange(
CChangesOFormDocumentFieldMaster,
window['AscDFH'].historyitem_OForm_Document_FieldMaster,
function()
{
let field = AscCommon.g_oTableId.GetById(this.Key);
if (-1 === this.Class.FieldMasters.indexOf(field))
this.Class.FieldMasters.push(field);
},
function()
{
let field = AscCommon.g_oTableId.GetById(this.Key);
let index = this.Class.FieldMasters.indexOf(field);
if (-1 !== index)
this.Class.FieldMasters.splice(index, 1);
}
);
window['AscDFH'].CChangesOFormDocumentFieldMaster = CChangesOFormDocumentFieldMaster;
/**
* @constructor
* @extends {window['AscDFH'].CChangesBaseStringProperty}
*/
function CChangesOFormDocumentDefaultUser(Class, Old, New)
{
window['AscDFH'].CChangesBaseStringProperty.call(this, Class, Old, New);
}
window['AscDFH'].InheritPropertyChange(
CChangesOFormDocumentDefaultUser,
window['AscDFH'].CChangesBaseStringProperty,
window['AscDFH'].historyitem_OForm_Document_DefaultUser,
function(value)
{
let document = this.Class;
let userMaster = AscCommon.g_oTableId.GetById(value);
if (userMaster)
{
userMaster.setParent(document);
document.DefaultUser = userMaster;
}
},
false
);
window['AscDFH'].CChangesOFormDocumentDefaultUser = CChangesOFormDocumentDefaultUser;
/**
* @constructor
* @extends {window['AscDFH'].CChangesBaseBoolProperty}
*/
function CChangesOFormDocumentFinal(Class, Old, New)
{
window['AscDFH'].CChangesBaseBoolProperty.call(this, Class, Old, New);
}
window['AscDFH'].InheritPropertyChange(
CChangesOFormDocumentFinal,
window['AscDFH'].CChangesBaseBoolProperty,
window['AscDFH'].historyitem_OForm_Document_Final,
function(value)
{
this.Class.Final = value;
this.Class.onChangeFinal();
},
false
);
window['AscDFH'].CChangesOFormDocumentFinal = CChangesOFormDocumentFinal;
})(window);

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
@ -12,7 +12,7 @@
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
@ -36,6 +36,9 @@
{
window['AscDFH'].historyitem_OForm_FieldGroup_Weight = window['AscDFH'].historyitem_type_OForm_FieldGroup | 1;
window['AscDFH'].historyitem_OForm_FieldGroup_AddRemoveField = window['AscDFH'].historyitem_type_OForm_FieldGroup | 2;
window['AscDFH'].historyitem_OForm_FieldGroup_AddRemoveUser = window['AscDFH'].historyitem_type_OForm_FieldGroup | 3;
window['AscDFH'].historyitem_OForm_FieldGroup_Filled = window['AscDFH'].historyitem_type_OForm_FieldGroup | 4;
window['AscDFH'].historyitem_OForm_FieldGroup_Date = window['AscDFH'].historyitem_type_OForm_FieldGroup | 5;
/**
* @constructor
@ -52,6 +55,7 @@
function(value)
{
this.Class.Weight = value;
this.Class.onChange();
},
false
);
@ -73,6 +77,8 @@
let field = AscCommon.g_oTableId.GetById(this.Key);
if (-1 === this.Class.Fields.indexOf(field))
this.Class.Fields.push(field);
this.Class.onChange();
},
function()
{
@ -80,8 +86,83 @@
let index = this.Class.Fields.indexOf(field);
if (-1 !== index)
this.Class.Fields.splice(index, 1);
this.Class.onChange();
}
);
window['AscDFH'].CChangesOFormFieldGroupAddRemoveField = CChangesOFormFieldGroupAddRemoveField;
/**
* @constructor
* @extends {window['AscDFH'].CChangesDictionaryBase}
*/
function CChangesOFormFieldGroupAddRemoveUser(Class, userMasterId, isAdd)
{
window['AscDFH'].CChangesDictionaryBase.call(this, Class, userMasterId, isAdd);
}
window['AscDFH'].InheritDictionaryChange(
CChangesOFormFieldGroupAddRemoveUser,
window['AscDFH'].historyitem_OForm_FieldGroup_AddRemoveUser,
function()
{
let userMaster = AscCommon.g_oTableId.GetById(this.Key);
if (-1 === this.Class.Users.indexOf(userMaster))
this.Class.Users.push(userMaster);
this.Class.onChange();
},
function()
{
let userMaster = AscCommon.g_oTableId.GetById(this.Key);
let index = this.Class.Fields.indexOf(userMaster);
if (-1 !== index)
this.Class.Users.splice(index, 1);
this.Class.onChange();
}
);
window['AscDFH'].CChangesOFormFieldGroupAddRemoveUser = CChangesOFormFieldGroupAddRemoveUser;
/**
* @constructor
* @extends {window['AscDFH'].CChangesBaseBoolProperty}
*/
function CChangesOFormFieldGroupFilled(Class, Old, New)
{
window['AscDFH'].CChangesBaseBoolProperty.call(this, Class, Old, New);
}
window['AscDFH'].InheritPropertyChange(
CChangesOFormFieldGroupFilled,
window['AscDFH'].CChangesBaseBoolProperty,
window['AscDFH'].historyitem_OForm_FieldGroup_Filled,
function(value)
{
this.Class.Filled = value;
this.Class.onChangeFilled();
},
false
);
window['AscDFH'].CChangesOFormFieldGroupFilled = CChangesOFormFieldGroupFilled;
/**
* @constructor
* @extends {window['AscDFH'].CChangesBaseStringProperty}
*/
function CChangesOFormFieldGroupDate(Class, Old, New)
{
window['AscDFH'].CChangesBaseStringProperty.call(this, Class, Old, New);
}
window['AscDFH'].InheritPropertyChange(
CChangesOFormFieldGroupDate,
window['AscDFH'].CChangesBaseStringProperty,
window['AscDFH'].historyitem_OForm_FieldGroup_Date,
function(value)
{
let v = parseInt(value);
this.Class.Date = isNaN(v) ? undefined : v;
},
false
);
window['AscDFH'].CChangesOFormFieldGroupDate = CChangesOFormFieldGroupDate;
})(window);

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
@ -12,7 +12,7 @@
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2019
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
@ -12,7 +12,7 @@
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions

View File

@ -0,0 +1,152 @@
/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function(window)
{
window['AscDFH'].historyitem_OForm_UserMaster_UserId = window['AscDFH'].historyitem_type_OForm_UserMaster | 1;
window['AscDFH'].historyitem_OForm_UserMaster_Role = window['AscDFH'].historyitem_type_OForm_UserMaster | 2;
window['AscDFH'].historyitem_OForm_UserMaster_Color = window['AscDFH'].historyitem_type_OForm_UserMaster | 3;
window['AscDFH'].historyitem_OForm_UserMaster_UserName = window['AscDFH'].historyitem_type_OForm_UserMaster | 4;
window['AscDFH'].historyitem_OForm_UserMaster_UserEmail = window['AscDFH'].historyitem_type_OForm_UserMaster | 5;
/**
* @constructor
* @extends {window['AscDFH'].CChangesBaseStringProperty}
*/
function CChangesOFormUserMasterUserId(Class, Old, New)
{
window['AscDFH'].CChangesBaseStringProperty.call(this, Class, Old, New);
}
window['AscDFH'].InheritPropertyChange(
CChangesOFormUserMasterUserId,
window['AscDFH'].CChangesBaseStringProperty,
window['AscDFH'].historyitem_OForm_UserMaster_UserId,
function(Value)
{
this.Class.UserId = Value;
this.Class.onChange();
},
false
);
window['AscDFH'].CChangesOFormUserMasterUserId = CChangesOFormUserMasterUserId;
/**
* @constructor
* @extends {window['AscDFH'].CChangesBaseStringProperty}
*/
function CChangesOFormUserMasterRole(Class, Old, New)
{
window['AscDFH'].CChangesBaseStringProperty.call(this, Class, Old, New);
}
window['AscDFH'].InheritPropertyChange(
CChangesOFormUserMasterRole,
window['AscDFH'].CChangesBaseStringProperty,
window['AscDFH'].historyitem_OForm_UserMaster_Role,
function(Value)
{
this.Class.Role = Value;
this.Class.onChange();
},
false
);
window['AscDFH'].CChangesOFormUserMasterRole = CChangesOFormUserMasterRole;
/**
* @constructor
* @extends {window['AscDFH'].CChangesBaseObjectProperty}
*/
function CChangesOFormUserMasterColor(Class, Old, New)
{
window['AscDFH'].CChangesBaseObjectProperty.call(this, Class, Old, New);
}
window['AscDFH'].InheritPropertyChange(
CChangesOFormUserMasterColor,
window['AscDFH'].CChangesBaseObjectProperty,
window['AscDFH'].historyitem_OForm_UserMaster_Color,
function(value)
{
this.Class.Color = value;
this.Class.onChange();
},
false
);
CChangesOFormUserMasterColor.prototype.private_CreateObject = function()
{
return new AscWord.CDocumentColor(0, 0, 0);
};
window['AscDFH'].CChangesOFormUserMasterColor = CChangesOFormUserMasterColor;
/**
* @constructor
* @extends {window['AscDFH'].CChangesBaseStringProperty}
*/
function CChangesOFormUserMasterUserName(Class, Old, New)
{
window['AscDFH'].CChangesBaseStringProperty.call(this, Class, Old, New);
}
window['AscDFH'].InheritPropertyChange(
CChangesOFormUserMasterUserName,
window['AscDFH'].CChangesBaseStringProperty,
window['AscDFH'].historyitem_OForm_UserMaster_UserName,
function(Value)
{
this.Class.UserName = Value;
this.Class.onChange();
},
false
);
window['AscDFH'].CChangesOFormUserMasterUserName = CChangesOFormUserMasterUserName;
/**
* @constructor
* @extends {window['AscDFH'].CChangesBaseStringProperty}
*/
function CChangesOFormUserMasterUserEmail(Class, Old, New)
{
window['AscDFH'].CChangesBaseStringProperty.call(this, Class, Old, New);
}
window['AscDFH'].InheritPropertyChange(
CChangesOFormUserMasterUserEmail,
window['AscDFH'].CChangesBaseStringProperty,
window['AscDFH'].historyitem_OForm_UserMaster_UserEmail,
function(Value)
{
this.Class.UserEmail = Value;
this.Class.onChange();
},
false
);
window['AscDFH'].CChangesOFormUserMasterUserEmail = CChangesOFormUserMasterUserEmail;
})(window);

300
oform/xml/XmlContext.js Normal file
View File

@ -0,0 +1,300 @@
/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function(window)
{
const PATH_USERS = "/users/";
const PATH_USER_MASTERS = "/userMasters/";
const PATH_FIELDS = "/fields/";
const PATH_FIELD_MASTERS = "/fieldMasters/";
/**
* Class for working with references inside xml structure during reading
* @constructor
*/
function XmlReaderContext(pkg)
{
this.pkg = pkg;
this.pathToUser = {};
this.pathToUserMaster = {};
this.pathToField = {};
this.pathToFieldMaster = {};
}
XmlReaderContext.prototype.getOformContext = function()
{
return this;
};
XmlReaderContext.prototype.getUser = function(path)
{
let user = this.pathToUser[path];
if (user)
return user;
let reader = this.getXmlReader(path);
if (!reader)
return null;
user = AscOForm.CUser.fromXml(reader);
this.pathToUser[path] = user;
return user;
};
XmlReaderContext.prototype.getUserMaster = function(path)
{
let userMaster = this.pathToUserMaster[path];
if (userMaster)
return userMaster;
let reader = this.getXmlReader(path);
if (!reader)
return null;
userMaster = AscOForm.CUserMaster.fromXml(reader);
this.pathToUserMaster[path] = userMaster;
return userMaster;
};
XmlReaderContext.prototype.getField = function(path)
{
let field = this.pathToField[path];
if (field)
return field;
let reader = this.getXmlReader(path);
if (!reader)
return null;
return null;
// TODO: implement
// field = AscOForm.CField.fromXml(reader);
// this.pathToField[path] = field;
// return field;
};
XmlReaderContext.prototype.getFieldMaster = function(path)
{
let fieldMaster = this.pathToFieldMaster[path];
if (fieldMaster)
return fieldMaster;
let reader = this.getXmlReader(path);
if (!reader)
return null;
fieldMaster = AscOForm.CFieldMaster.fromXml(reader);
this.pathToFieldMaster[path] = fieldMaster;
return fieldMaster;
};
XmlReaderContext.prototype.getAllUsers = function()
{
return this.getAllByMapAndPath(this.pathToUser, PATH_USERS, AscOForm.CUser.fromXml);
};
XmlReaderContext.prototype.getAllUserMasters = function()
{
return this.getAllByMapAndPath(this.pathToUserMaster, PATH_USER_MASTERS, AscOForm.CUserMaster.fromXml);
};
XmlReaderContext.prototype.getAllFields = function()
{
// TODO: Implement
return [];
//return this.getAllByMapAndPath(this.pathToField, PATH_FIELDS, AscOForm.CField.fromXml);
};
XmlReaderContext.prototype.getAllFieldMasters = function()
{
return this.getAllByMapAndPath(this.pathToFieldMaster, PATH_FIELD_MASTERS, AscOForm.CFieldMaster.fromXml);
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Private area
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
XmlReaderContext.prototype.getXmlReader = function(path)
{
let part = this.pkg.getPartByUri(path);
if (!part)
return null;
let partContent = part.getDocumentContent();
if (!partContent)
return null;
let xmlParserContext = new AscCommon.XmlParserContext();
xmlParserContext.setOformContext(this);
return new AscCommon.StaxParser(partContent, part, xmlParserContext);
};
XmlReaderContext.prototype.getAllByMapAndPath = function(map, path, fromXml)
{
let result = [];
for (let key in map)
{
result.push(map[key]);
}
for (let uri in this.pkg.parts)
{
if (uri.startsWith(path)
&& uri.endsWith(".xml")
&& !map[uri])
{
let reader = this.getXmlReader(uri);
if (!reader)
return;
let element = fromXml(reader);
if (element)
{
map[uri] = element;
result.push(element);
}
}
}
return result;
}
//--------------------------------------------------------export----------------------------------------------------
AscOForm.XmlReaderContext = XmlReaderContext;
/**
* Class for working with references inside xml structure during writing
* @constructor
*/
function XmlWriterContext(pkg)
{
this.pkg = pkg;
this.userToPart = {};
this.userMasterToPart = {};
this.fieldToPart = {};
this.fieldMasterToPart = {};
this.partToRId = {};
}
XmlWriterContext.prototype.clearCurrentPartDataMaps = function()
{
this.partToRId = {};
};
XmlWriterContext.prototype.getRId = function(part)
{
if (this.partToRId[part.uri])
return this.partToRId[part.uri];
if (!this.part)
return "";
let target = part.uri;
let base = this.part.uri;
if (target.startsWith('/'))
target = target.substring(1);
if (base.startsWith('/'))
base = base.substring(1);
let baseSplit = base.split('/');
let targetSplit = target.split('/');
while (baseSplit.length && targetSplit.length && baseSplit[0] === targetSplit[0])
{
baseSplit.shift();
targetSplit.shift()
}
let relative = "";
for (let index = 0, count = baseSplit.length - 1; index < count; ++index)
{
relative += "../";
}
relative += targetSplit.join('/');
let rId = this.part.addRelationship(null, relative);
this.partToRId[part.uri] = rId;
return rId;
};
XmlWriterContext.prototype.getUserPart = function(user)
{
return this.getPartFromPkg(this.userToPart, user, AscCommon.openXml.Types.oformUser);
};
XmlWriterContext.prototype.haveUserPart = function(user)
{
return !!this.userToPart[user.GetId()];
};
XmlWriterContext.prototype.getUserMasterPart = function(userMaster)
{
return this.getPartFromPkg(this.userMasterToPart, userMaster, AscCommon.openXml.Types.oformUserMaster);
};
XmlWriterContext.prototype.getDefaultUserMasterPart = function(userMaster)
{
return this.getPartFromPkg(this.userMasterToPart, userMaster, AscCommon.openXml.Types.oformDefaultUserMaster);
};
XmlWriterContext.prototype.haveUserMasterPart = function(userMaster)
{
return !!this.userMasterToPart[userMaster.GetId()];
};
XmlWriterContext.prototype.getFieldPart = function(field)
{
return this.getPartFromPkg(this.fieldToPart, field, AscCommon.openXml.Types.oformField);
};
XmlWriterContext.prototype.haveFieldPart = function(field)
{
return !!this.fieldToPart[field.GetId()];
};
XmlWriterContext.prototype.getFieldMasterPart = function(fieldMaster)
{
return this.getPartFromPkg(this.fieldMasterToPart, fieldMaster, AscCommon.openXml.Types.oformFieldMaster);
};
XmlWriterContext.prototype.haveFieldMasterPart = function(fieldMaster)
{
return !!this.fieldMasterToPart[fieldMaster];
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Private area
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
XmlWriterContext.prototype.getPartFromPkg = function(map, object, contentType)
{
let objectId = object.GetId();
if (map[objectId])
return map[objectId];
let part = this.pkg.addPart(contentType).part;
let xmlWriter = new AscCommon.CMemory();
xmlWriter.context = this;
part.setDataXml(object, xmlWriter);
map[objectId] = part;
return part;
};
//--------------------------------------------------------export----------------------------------------------------
AscOForm.XmlWriterContext = XmlWriterContext;
})(window);

129
oform/xml/XmlPackage.js Normal file

File diff suppressed because one or more lines are too long

43
plugin-events.js Normal file
View File

@ -0,0 +1,43 @@
/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
/**
* Event: onSubmitForm
* @event Plugin#onSubmitForm
* @memberof Plugin
* @typeofeditors ["CDE", "CFE"]
* @alias onSubmitForm
* @description The function called when the user clicks the "Complete & Submit" button.
* @see office-js-api/Examples/Plugins/{Editor}/Plugin/Events/onSubmitForm.js
*/
"use strict";