Compare commits

...

38 Commits

Author SHA1 Message Date
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
f1fa43375c Merge branch hotfix/v7.5.1 into develop 2023-11-15 12:53:45 +00:00
19 changed files with 510 additions and 215 deletions

59
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;
@ -87,7 +88,11 @@ window["AscOForm"] = window.AscOForm = AscOForm;
if (oFormPr)
{
private_ApplyFormPr(oCC, oFormPr, oLogicDocument);
private_CheckFormKey(oCC, oLogicDocument);
if (oPr && oPr.GroupKey)
private_CheckRadioButtonChoice(oCC, oLogicDocument, oPr.GroupKey);
else
private_CheckFormKey(oCC, oLogicDocument);
}
if (oCommonPr)
@ -166,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)
@ -179,16 +184,31 @@ window["AscOForm"] = window.AscOForm = AscOForm;
{
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlPicture);
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);
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)
{
@ -240,6 +260,11 @@ window["AscOForm"] = window.AscOForm = AscOForm;
oLogicDocument.Recalculate(true);
oCC.UpdatePictureFormLayout();
}
else
{
oCC.ReplaceContentWithPlaceHolder();
oCC.ApplyPicturePr(true);
}
}
if (oCC && oCommonPr)
@ -258,6 +283,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();
@ -617,6 +646,26 @@ 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();
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)

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,11 +38,13 @@
// Import
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const AscBuilder = window["AscBuilder"];
const ApiDocument = AscBuilder.ApiDocument;
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;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
@ -58,8 +60,10 @@
* @typedef {Object} FormPrBase
* @property {string} key - Form key.
* @property {string} tip - Form tip text.
* @property {string} tag - Form tag.
* @property {boolean} required - Specifies if the form is required or not.
* @property {string} placeholder - Form placeholder text.
* @see office-js-api/Examples/Enumerations/FormPrBase.js
*/
/**
@ -70,11 +74,13 @@
* @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
*/
/**
@ -82,11 +88,13 @@
* @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
*/
@ -94,11 +102,13 @@
* 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
*/
/**
@ -111,21 +121,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
*/
/**
@ -135,238 +149,309 @@
* @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
* @typeofeditors ["CDE", "CFE"]
* @param {TextFormPr} oFormPr - Text field properties.
* @returns {ApiTextForm}
* @see office-js-api/Examples/Forms/Api/Methods/CreateTextForm.js
*/
Api.prototype.CreateTextForm = function(oFormPr)
{
if (!oFormPr)
oFormPr = {};
let form = CreateCommonForm(oFormPr);
ApplyTextFormPr(form, oFormPr);
CheckFormKey(form);
return new AscBuilder.ApiTextForm(form);
return executeNoFormLockCheck(function()
{
if (!oFormPr)
oFormPr = {};
let form = CreateCommonForm(oFormPr);
ApplyTextFormPr(form, oFormPr);
CheckFormKey(form);
return new AscBuilder.ApiTextForm(form);
}, this);
};
/**
* Creates a checkbox / radio button with the specified checkbox / radio button properties.
* @memberof Api
* @typeofeditors ["CDE", "CFE"]
* @param {CheckBoxFormPr} oFormPr - Checkbox / radio button properties.
* @returns {ApiCheckBoxForm}
* @see office-js-api/Examples/Forms/Api/Methods/CreateCheckBoxForm.js
*/
Api.prototype.CreateCheckBoxForm = function(oFormPr)
{
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 (!oFormPr)
oFormPr = {};
oFormPr["placeholder"] = undefined;
var oCC;
var oCheckboxPr = new AscCommon.CSdtCheckBoxPr();
if (GetBoolParameter(oFormPr["radio"], false))
{
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);
}, this);
};
/**
* Creates a combo box / dropdown list with the specified combo box / dropdown list properties.
* @memberof Api
* @typeofeditors ["CDE", "CFE"]
* @param {ComboBoxFormPr} oFormPr - Combo box / dropdown list properties.
* @returns {ApiComboBoxForm}
* @see office-js-api/Examples/Forms/Api/Methods/CreateComboBoxForm.js
*/
Api.prototype.CreateComboBoxForm = function(oFormPr)
{
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 (!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)
{
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(oFormPr["autoFit"], false));
if (!GetBoolParameter(oFormPr["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);
CheckFormKey(oCC);
return new AscBuilder.ApiComboBoxForm(oCC);
}, this);
};
/**
* Creates a picture form with the specified picture form properties.
* @memberof Api
* @typeofeditors ["CDE", "CFE"]
* @param {PictureFormPr} oFormPr - Picture form properties.
* @returns {ApiPictureForm}
* @see office-js-api/Examples/Forms/Api/Methods/CreatePictureForm.js
*/
Api.prototype.CreatePictureForm = function(oFormPr)
{
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;
}
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);
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)
{
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(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);
}, this);
};
/**
* Creates a date form with the specified date form properties.
* @memberof Api
* @typeofeditors ["CDE", "CFE"]
* @param {DateFormPr} oFormPr - Date form properties.
* @returns {ApiDateForm}
* @see office-js-api/Examples/Forms/Api/Methods/CreateDateForm.js
*/
Api.prototype.CreateDateForm = function(oFormPr)
{
return executeNoFormLockCheck(function()
{
if (!oFormPr)
oFormPr = {};
let form = CreateCommonForm(oFormPr);
ApplyDateFormPr(form, oFormPr);
CheckFormKey(form);
return new AscBuilder.ApiDateForm(form);
}, this);
};
/**
* Inserts a text box with the specified text box properties over the selected text.
* @memberof ApiDocument
* @typeofeditors ["CDE", "CFE"]
* @param {TextFormInsertPr} oFormPr - Properties for inserting a text field.
* @returns {ApiTextForm}
* @see office-js-api/Examples/Forms/ApiDocument/Methods/InsertTextForm.js
*/
ApiDocument.prototype.InsertTextForm = function(oFormPr)
{
if (!oFormPr)
oFormPr = {};
let logicDocument = this.Document;
let placeholder = GetStringParameter(oFormPr["placeholder"], undefined);
if (GetBoolParameter(oFormPr["placeholderFromSelection"], false))
placeholder = logicDocument.GetSelectedText();
if (!GetBoolParameter(oFormPr["keepSelectedTextInForm"], true))
logicDocument.RemoveBeforePaste();
let contentControl = logicDocument.AddContentControl(c_oAscSdtLevelType.Inline);
if (!contentControl)
return null;
ApplyCommonFormPr(contentControl, oFormPr);
SetFormPlaceholder(contentControl, placeholder);
ApplyTextFormPr(contentControl, oFormPr, true);
CheckFormKey(contentControl);
return new AscBuilder.ApiTextForm(contentControl);
return executeNoFormLockCheck(function()
{
if (!oFormPr)
oFormPr = {};
let logicDocument = this.Document;
let placeholder = GetStringParameter(oFormPr["placeholder"], undefined);
if (GetBoolParameter(oFormPr["placeholderFromSelection"], false))
placeholder = logicDocument.GetSelectedText();
if (!GetBoolParameter(oFormPr["keepSelectedTextInForm"], true))
logicDocument.RemoveBeforePaste();
let contentControl = logicDocument.AddContentControl(c_oAscSdtLevelType.Inline);
if (!contentControl)
return null;
ApplyCommonFormPr(contentControl, oFormPr);
SetFormPlaceholder(contentControl, placeholder);
ApplyTextFormPr(contentControl, oFormPr, true);
CheckFormKey(contentControl);
return new AscBuilder.ApiTextForm(contentControl);
}, this);
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Private area
@ -380,6 +465,10 @@
let placeholder = oFormPr ? GetStringParameter(oFormPr["placeholder"], undefined) : undefined;
SetFormPlaceholder(contentControl, placeholder);
let tag = oFormPr ? GetStringParameter(oFormPr["tag"], undefined) : undefined;
if (tag)
contentControl.SetTag(tag);
contentControl.ReplaceContentWithPlaceHolder(false);
contentControl.UpdatePlaceHolderTextPrForForm();
return contentControl;
@ -412,6 +501,19 @@
textFormPr.SetWidth((GetNumberParameter(formPr["cellWidth"], 0) * 72 * 20 / 25.4) | 0);
form.ApplyTextFormPr(textFormPr, keepContent);
}
function ApplyDateFormPr(form, formPr)
{
let datePickerPr = new AscCommon.CSdtDatePickerPr();
var nLcid = Asc.g_oLcidNameToIdMap[formPr["lang"]];
if (undefined == nLcid)
nLcid = 1033;
datePickerPr.SetDateFormat(GetStringParameter(formPr["format"], "mm/dd/yyyy"));
datePickerPr.SetLangId(nLcid);
form.ApplyDatePickerPr(datePickerPr);
}
function CheckFormKey(form)
{
let logicDocument = editor && editor.WordControl && editor.WordControl.m_oLogicDocument;
@ -438,9 +540,11 @@
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Api.prototype["CreateTextForm"] = Api.prototype.CreateTextForm;
Api.prototype["CreatePictureForm"] = Api.prototype.CreatePictureForm;
Api.prototype["CreateDateForm"] = Api.prototype.CreateDateForm;
Api.prototype["CreateCheckBoxForm"] = Api.prototype.CreateCheckBoxForm;
Api.prototype["CreateComboBoxForm"] = Api.prototype.CreateComboBoxForm;
ApiDocument.prototype["InsertTextForm"] = ApiDocument.prototype.InsertTextForm;
}(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)
@ -41,16 +41,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,8 +60,7 @@
* @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()
{
@ -82,8 +83,7 @@
* @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)
{
@ -109,8 +109,7 @@
* @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)
{
@ -123,9 +122,7 @@
* @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)
{
@ -171,3 +168,4 @@
};
})(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)
@ -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;
@ -444,6 +456,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;
@ -561,6 +588,39 @@
{
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);
}
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Private area
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -598,5 +658,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)
@ -78,6 +78,15 @@
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)
this.FieldGroup.setFilled(isFilled);
};
CRole.prototype.getFieldGroup = function()
{
return this.FieldGroup;

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)
@ -568,6 +568,13 @@
this.OForm.onChangeRoles();
};
CDocument.prototype.onChangeFieldGroup = function(fieldGroup)
{
if (!this.OForm)
return;
this.OForm.onChangeFieldGroupFilled(fieldGroup);
};
CDocument.prototype.onChangeUserMaster = function(userMaster)
{
if (!this.OForm)

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,7 @@
{
AscOForm.CBaseFormatObject.call(this);
this.Filled = false;
this.Weight = null;
this.Fields = [];
this.Users = [];
@ -57,6 +58,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.onChange();
};
CFieldGroup.prototype.setWeight = function(value)
{
if (this.Weight === value)
@ -149,6 +163,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 +228,8 @@
writer.WriteXmlNodeStart("fieldGroup");
writer.WriteXmlNullableAttributeInt("weight", this.getWeight());
if (this.isFilled())
writer.WriteXmlNullableAttributeBool("filled", true);
writer.WriteXmlAttributesEnd();
for (let userIndex = 0, userCount = this.Users.length; userIndex < userCount; ++userIndex)
@ -239,8 +262,11 @@
while (reader.MoveToNextAttribute())
{
if ("weight" === reader.GetNameNoNS())
let attrName = reader.GetNameNoNS();
if ("weight" === attrName)
fG.setWeight(reader.GetValueInt());
if ("filled" === attrName)
fG.setFilled(reader.GetValueBool());
}
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)

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
@ -228,5 +245,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)

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)
@ -37,6 +37,7 @@
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;
/**
* @constructor
@ -120,5 +121,26 @@
}
);
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.onChange();
},
false
);
window['AscDFH'].CChangesOFormFieldGroupFilled = CChangesOFormFieldGroupFilled;
})(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)

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)