Compare commits

..

131 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
8a0aa0fdb4 Merge branch hotfix/v7.3.3 into master 2023-03-15 10:51:27 +00:00
b4073edd9a [oform] Fix problem with lock check when setting form value 2023-02-08 23:52:26 +05:00
20 changed files with 1483 additions and 405 deletions

302
api.js
View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)
@ -61,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;
@ -79,7 +80,7 @@ window["AscOForm"] = window.AscOForm = AscOForm;
AscFonts.FontPickerByCharacter.getFontBySymbol(nUncheckedSymbol);
}
function private_ApplyPrToCheckBox(oCC)
function private_ApplyPrToCheckBox(oCC, checkBoxPr)
{
if (!oCC)
return;
@ -87,10 +88,13 @@ window["AscOForm"] = window.AscOForm = AscOForm;
if (oFormPr)
{
private_ApplyFormPr(oCC, oFormPr, oLogicDocument);
oCC.UpdatePlaceHolderTextPrForForm();
private_CheckFormKey(oCC, oLogicDocument);
if (oPr && oPr.GroupKey)
private_CheckRadioButtonChoice(oCC, oLogicDocument, oPr.GroupKey);
else
private_CheckFormKey(oCC, oLogicDocument);
}
if (oCommonPr)
oCC.SetContentControlPr(oCommonPr);
}
@ -118,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);
@ -142,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();
@ -167,7 +171,7 @@ 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)
@ -178,18 +182,44 @@ window["AscOForm"] = window.AscOForm = AscOForm;
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)
{
@ -241,6 +271,11 @@ window["AscOForm"] = window.AscOForm = AscOForm;
oLogicDocument.Recalculate(true);
oCC.UpdatePictureFormLayout();
}
else
{
oCC.ReplaceContentWithPlaceHolder();
oCC.ApplyPicturePr(true, w, h);
}
}
if (oCC && oCommonPr)
@ -259,6 +294,10 @@ 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();
@ -288,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();
@ -305,14 +345,14 @@ window["AscOForm"] = window.AscOForm = AscOForm;
oLogicDocument.RemoveTextSelection();
if (!oLogicDocument.IsSelectionLocked(AscCommon.changestype_Paragraph_Content))
{
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlList);
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlDatePicker, undefined, undefined, true);
let dateTimePr = null;
let formPr = null;
let ccPr = null;
// Пока для совместимости со старым форматом оставляем, чтобы настройки могли приходить по старому (oPr, oCommonPr)
// но в будущем надо перейти на новый вариант contentPr (AscCommon.CContentControlPr)
// 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;
@ -425,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)
{
@ -442,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)
{
@ -463,6 +670,28 @@ 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)
@ -470,39 +699,38 @@ window["AscOForm"] = window.AscOForm = AscOForm;
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 === c_oAscDefaultPlaceholderName.Text
|| docPartId === c_oAscDefaultPlaceholderName.List
|| docPartId === c_oAscDefaultPlaceholderName.DateTime))
(docPartId === glossary.GetDefaultPlaceholderTextDocPartId()
|| docPartId === glossary.GetDefaultPlaceholderListDocPartId()
|| docPartId === glossary.GetDefaultPlaceholderDateTimeDocPartId()))
{
if (docPartId === c_oAscDefaultPlaceholderName.Text)
form.SetPlaceholder(c_oAscDefaultPlaceholderName.TextOform);
else if (docPartId === c_oAscDefaultPlaceholderName.List)
form.SetPlaceholder(c_oAscDefaultPlaceholderName.ListOform);
else if (docPartId === c_oAscDefaultPlaceholderName.DateTime)
form.SetPlaceholder(c_oAscDefaultPlaceholderName.DateOform);
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();
}
if (form.IsMainForm() && formPr.GetFixed())
let paragraph = form.GetParagraph();
if (form.IsMainForm() && formPr.GetFixed() && (!paragraph || !paragraph.GetParentShape()))
{
logicDocument.Recalculate(true);
let drawing = form.ConvertFormToFixed();
if (drawing)
{
let drawingPr = new Asc.asc_CImgProperty();
drawingPr.asc_putWrappingStyle(Asc.c_oAscWrapStyle2.Square);
drawing.Set_Props(drawingPr);
form.MoveCursorToContentControl(false);
}
drawing.SelectAsDrawing();
}
}
@ -510,6 +738,10 @@ window["AscOForm"] = window.AscOForm = AscOForm;
{
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;

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)
@ -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,15 +53,18 @@
* @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
*/
/**
@ -69,22 +75,41 @@
* @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 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 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 / 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 / radio button properties.
* @typedef {FormPrBase | CheckBoxFormPrBase} CheckBoxFormPr
* @see office-js-api/Examples/Enumerations/CheckBoxFormPr.js
*/
/**
@ -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 / 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
*/
/**
* 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 field 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 with the specified checkbox / radio button properties.
* @memberof Api
* @param {CheckBoxFormPr} oFormPr - Checkbox / radio button 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 list with the specified combo box / dropdown list properties.
* @memberof Api
* @param {ComboBoxFormPr} oFormPr - Combo box / dropdown list 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-2023
* (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)
@ -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

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)
@ -35,7 +35,7 @@
(function(window)
{
/**
* Основной класс для работы с форматом oform
* Main class for working with the oform format
* @param document {AscWord.CDocument}
* @constructor
*/
@ -45,7 +45,7 @@
this.Document = document;
this.CurrentUser = null;
// Сейчас у нас роль - это ровно один userMaster и ровно одна группа полей
// Currently, a role is exactly one userMaster and exactly one field group
this.Roles = [];
this.NeedUpdateRoles = true;
this.NeedRedraw = true;
@ -78,7 +78,7 @@
writer.context = xmlPkg.getContext();
this.Format.toPkg(xmlPkg, opt_fieldMastersPartMap);
// Наш XmlPackage работает в общей папке, а нам нужно запихнуть в zip подпапку oform
// 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);
@ -96,10 +96,22 @@
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;
@ -163,10 +175,9 @@
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)
@ -176,14 +187,14 @@
{
if (!this.startAction(AscDFH.historydescription_OForm_RemoveRole))
return false;
defaultUserMaster.initDefaultUser();
this.NeedRedraw = true;
this.endAction();
return true;
}
return false;
}
@ -231,6 +242,38 @@
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;
@ -444,6 +487,21 @@
{
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;
@ -470,7 +528,7 @@
let user = fieldGroup.getFirstUser();
if (!user)
{
// TODO: Разобраться с такими группами
// TODO: Handle such groups
}
let haveRole = false;
@ -485,7 +543,7 @@
if (haveRole)
{
// TODO: Разобраться с такими ситуациями
// TODO: Handle such situations
}
let weight = fieldGroup.getWeight();
@ -511,7 +569,7 @@
};
OForm.prototype.correctFieldGroups = function()
{
// Проверяем есть ли хоть одна группа с заданной ролью (где указан userMaster)
// 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);
@ -522,7 +580,7 @@
return;
}
// Нельзя, чтобы групп не было вообще
// There must be at least one group
let defaultGroup = new AscOForm.CFieldGroup();
defaultGroup.setWeight(this.Format.getMaxWeight() + 1);
this.Format.addFieldGroup(defaultGroup);
@ -561,6 +619,84 @@
{
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
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -582,11 +718,18 @@
if (!logicDocument)
return;
this.onEndAction();
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-----------------------------------------------------
@ -598,5 +741,6 @@
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);

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)
@ -35,8 +35,8 @@
(function(window)
{
/**
* Класс представляющий роль при заполнении формы. В данный момент роль - это ровно один userMaster
* и группа полей связанные с данным userMaster
* 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
@ -78,13 +78,36 @@
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()

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)
@ -37,7 +37,7 @@
/**
* Базовый класс для всех форматных классов в oform
* Base class for all format classes in oform
* @constructor
*/
function CBaseFormatObject()

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)
@ -35,7 +35,7 @@
(function(window)
{
/**
* Основной класс для работы с форматом oform
* Main class for working with the oform format
* @param oform {AscOForm.OForm}
* @constructor
* @extends AscOForm.CBaseFormatObject
@ -50,16 +50,17 @@
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 = [];
@ -153,6 +154,19 @@
{
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))
@ -303,6 +317,9 @@
case "description":
this.setDescription(reader.GetTextDecodeXml());
break;
case "final":
this.setFinal(reader.GetTextBool());
break
case "type":
this.setType(reader.GetTextDecodeXml());
break;
@ -357,6 +374,9 @@
if (application)
writer.WriteXmlNodeWithText("application", application);
if (this.isFinal())
writer.WriteXmlNodeWithText("final", "1");
let documentId = this.getDocumentId();
if (documentId)
writer.WriteXmlNodeWithText("id", documentId);
@ -568,6 +588,13 @@
this.OForm.onChangeRoles();
};
CDocument.prototype.onChangeFieldGroupFilled = function(fieldGroup)
{
if (!this.OForm)
return;
this.OForm.onChangeFieldGroupFilled(fieldGroup);
};
CDocument.prototype.onChangeUserMaster = function(userMaster)
{
if (!this.OForm)
@ -590,8 +617,8 @@
let fieldMaster = form.GetFieldMaster();
if (!fieldMaster)
{
// TODO: Мы не можем здесь генерировать id, т.к. данная функция вызывается на открытии
// и тогда у разных клиентов будут разные id. Поэтому, пока лучше вообще такие поля будут без id
// 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());
@ -618,6 +645,13 @@
this.removeFieldMasterByIndex(fieldIndex);
}
};
CDocument.prototype.onChangeFinal = function()
{
if (!this.OForm)
return;
this.OForm.sendEvent("asc_onOFormChangeFinal", this.isFinal());
};
//--------------------------------------------------------export----------------------------------------------------
AscOForm.CDocument = CDocument;

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)
@ -42,6 +42,8 @@
{
AscOForm.CBaseFormatObject.call(this);
this.Filled = false;
this.Date = undefined;
this.Weight = null;
this.Fields = [];
this.Users = [];
@ -57,6 +59,19 @@
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)
@ -70,6 +85,18 @@
{
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))
@ -149,6 +176,13 @@
this.Parent.onChangeFieldGroup(this);
};
CFieldGroup.prototype.onChangeFilled = function()
{
if (!this.Parent)
return;
this.Parent.onChangeFieldGroupFilled(this);
};
CFieldGroup.prototype.getAllFields = function()
{
let fields = [];
@ -207,6 +241,15 @@
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)
@ -239,8 +282,17 @@
while (reader.MoveToNextAttribute())
{
if ("weight" === reader.GetNameNoNS())
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();

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)
@ -97,9 +97,28 @@
};
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;
};

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)
@ -34,6 +34,23 @@
(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
@ -42,10 +59,12 @@
function CUserMaster(generateId)
{
AscOForm.CBaseFormatObject.call(this);
this.UserId = undefined;
this.Role = undefined;
this.Color = undefined;
this.UserId = undefined;
this.UserName = undefined;
this.UserEmail = undefined;
this.Role = undefined;
this.Color = undefined;
if (true === generateId)
this.setUserId(AscCommon.CreateGUID());
@ -74,6 +93,32 @@
{
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)
@ -89,6 +134,10 @@
{
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;
@ -106,8 +155,8 @@
};
CUserMaster.prototype.initDefaultUser = function()
{
// TODO: Возможно стоит придумать уникальный id общий для дефолтовой роли
this.setRole(AscCommon.translateManager.getValue("Anyone"));
// TODO: Consider creating a unique id common for the default role
this.setRole("Anyone");
this.setColor(255, 239, 191);
};
CUserMaster.prototype.compare = function(user)
@ -175,6 +224,12 @@
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);
@ -206,6 +261,12 @@
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;
@ -228,5 +289,7 @@
};
//--------------------------------------------------------export----------------------------------------------------
AscOForm.CUserMaster = CUserMaster;
AscOForm.getNoRole = getNoRole;
})(window);

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)
@ -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-2023
* (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)
@ -45,6 +45,7 @@
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
@ -325,5 +326,26 @@
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-2023
* (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)
@ -37,6 +37,8 @@
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
@ -120,5 +122,47 @@
}
);
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-2023
* (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)

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)
@ -34,9 +34,11 @@
(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_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
@ -104,5 +106,47 @@
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);

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)
@ -40,7 +40,7 @@
const PATH_FIELD_MASTERS = "/fieldMasters/";
/**
* Класс для работы с ссылками внутри xml структуры во время чтения
* Class for working with references inside xml structure during reading
* @constructor
*/
function XmlReaderContext(pkg)
@ -184,7 +184,7 @@
/**
* Класс для работы с ссылками внутри xml структуры во время записи
* Class for working with references inside xml structure during writing
* @constructor
*/
function XmlWriterContext(pkg)

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
* (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)
@ -35,7 +35,7 @@
(function(window)
{
/**
* Класс для работы с форматом oform в xml
* Class for working with the oform format in xml
* @constructor
* @extends {AscCommon.openXml.OpenXmlPackage}
*/

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";