From c7e4f9b83c1860ee6be3592d34218f07e61f21f4 Mon Sep 17 00:00:00 2001
From: Julia Radzhabova <julia.radzhabova@onlyoffice.com>
Date: Thu, 1 Dec 2022 23:29:52 +0300
Subject: [PATCH] [DE] Show settings for datetime field

---
 .../main/app/template/FormSettings.template   |  16 ++-
 .../main/app/view/FormSettings.js             | 118 +++++++++++++++++-
 2 files changed, 128 insertions(+), 6 deletions(-)

diff --git a/apps/documenteditor/main/app/template/FormSettings.template b/apps/documenteditor/main/app/template/FormSettings.template
index c9e880ce0..04d88720c 100644
--- a/apps/documenteditor/main/app/template/FormSettings.template
+++ b/apps/documenteditor/main/app/template/FormSettings.template
@@ -59,7 +59,7 @@
     </tr>
     <tr class="form-textfield-mask">
         <td class="padding-small">
-            <div id="form-txt-mask"></div>
+            <div id="form-txt-mask" style="width: 100%;"></div>
         </td>
     </tr>
     <tr class="form-textfield-regexp">
@@ -99,6 +99,20 @@
         </td>
     </tr>
 </table>
+<table cols="1">
+    <tr class="form-datetime">
+        <td class="padding-small">
+            <label class="input-label"><%= scope.textDateFormat %></label>
+            <div id="form-cmb-date-format" style="width: 100%;"></div>
+        </td>
+    </tr>
+    <tr class="form-datetime">
+        <td class="padding-small">
+            <label class="input-label"><%= scope.textLang %></label>
+            <div id="form-cmb-date-lang" style="width: 100%;"></div>
+        </td>
+    </tr>
+</table>
 <table cols="1">
     <tr class="form-fixed">
         <td class="padding-small">
diff --git a/apps/documenteditor/main/app/view/FormSettings.js b/apps/documenteditor/main/app/view/FormSettings.js
index 2c7e786c4..ef76eeb3b 100644
--- a/apps/documenteditor/main/app/view/FormSettings.js
+++ b/apps/documenteditor/main/app/view/FormSettings.js
@@ -109,6 +109,7 @@ define([
             this.ConnectedSettings = el.find('.form-connected');
             this.FixedSettings = el.find('.form-fixed');
             this.NotInComplexSettings = el.find('.form-not-in-complex');
+            this.DateOnlySettings = el.find('.form-datetime');
         },
 
         createDelayedElements: function() {
@@ -126,7 +127,8 @@ define([
             this.cmbKey = new Common.UI.ComboBox({
                 el: $markup.findById('#form-combo-key'),
                 cls: 'input-group-nr',
-                menuStyle: 'min-width: 100%;',
+                menuCls: 'menu-absolute',
+                menuStyle: 'min-width: 195px; max-height: 190px;',
                 editable: true,
                 data: [],
                 dataHint: '1',
@@ -296,7 +298,8 @@ define([
             this.cmbGroupKey = new Common.UI.ComboBox({
                 el: $markup.findById('#form-combo-group-key'),
                 cls: 'input-group-nr',
-                menuStyle: 'min-width: 100%;',
+                menuCls: 'menu-absolute',
+                menuStyle: 'min-width: 195px; max-height: 190px;',
                 editable: true,
                 data: [],
                 dataHint: '1',
@@ -529,7 +532,8 @@ define([
             this.cmbRoles = new Common.UI.ComboBoxCustom({
                 el: $markup.findById('#form-combo-roles'),
                 cls: 'menu-roles',
-                menuStyle: 'min-width: 100%;',
+                menuCls: 'menu-absolute',
+                menuStyle: 'min-width: 195px; max-height: 190px;',
                 style: 'width: 100%;',
                 editable: false,
                 template    : _.template(template.join('')),
@@ -634,6 +638,53 @@ define([
                 setTimeout(function(){me.txtFormatSymbols._input && me.txtFormatSymbols._input.select();}, 1);
             });
 
+            // Date & Time
+
+            this.cmbDateFormat = new Common.UI.ComboBox({
+                el: $markup.findById('#form-cmb-date-format'),
+                cls: 'input-group-nr',
+                menuCls: 'menu-absolute',
+                menuStyle: 'min-width: 195px; max-height: 190px;',
+                editable: true,
+                data: [],
+                dataHint: '1',
+                dataHintDirection: 'bottom',
+                dataHintOffset: 'big'
+            });
+            this.cmbDateFormat.setValue('');
+            this.lockedControls.push(this.cmbDateFormat);
+            this.cmbDateFormat.on('selected', this.onDateFormatChanged.bind(this));
+            this.cmbDateFormat.on('changed:after', this.onDateFormatChanged.bind(this));
+            this.cmbDateFormat.on('hide:after', this.onHideMenus.bind(this));
+            this.cmbDateFormat.cmpEl.on('focus', 'input.form-control', function() {
+                setTimeout(function(){me.cmbDateFormat._input && me.cmbDateFormat._input.select();}, 1);
+            });
+
+            var data = [{ value: 0x042C }, { value: 0x0402 }, { value: 0x0405 }, { value: 0x0C07 }, { value: 0x0407 },  {value: 0x0807}, { value: 0x0408 }, { value: 0x0C09 }, { value: 0x0809 }, { value: 0x0409 }, { value: 0x0C0A }, { value: 0x080A },
+                { value: 0x040B }, { value: 0x040C }, { value: 0x100C }, { value: 0x0410 }, { value: 0x0810 }, { value: 0x0411 }, { value: 0x0412 }, { value: 0x0426 }, { value: 0x040E }, { value: 0x0413 }, { value: 0x0415 }, { value: 0x0416 },
+                { value: 0x0816 }, { value: 0x0419 }, { value: 0x041B }, { value: 0x0424 }, { value: 0x081D }, { value: 0x041D }, { value: 0x041F }, { value: 0x0422 }, { value: 0x042A }, { value: 0x0804 }];
+            data.forEach(function(item) {
+                var langinfo = Common.util.LanguageInfo.getLocalLanguageName(item.value);
+                item.displayValue = langinfo[1];
+                item.langName = langinfo[0];
+            });
+            this.cmbLang = new Common.UI.ComboBox({
+                el: $markup.findById('#form-cmb-date-lang'),
+                cls: 'input-group-nr',
+                menuCls: 'menu-absolute',
+                menuStyle: 'min-width: 195px; max-height: 190px;',
+                editable: false,
+                data: data,
+                dataHint: '1',
+                dataHintDirection: 'bottom',
+                dataHintOffset: 'big'
+            });
+            this.lockedControls.push(this.cmbLang);
+            this.cmbLang.setValue(0x0409);
+            this.cmbLang.on('selected',function(combo, record) {
+                me.updateDateFormats(record.value);
+            });
+
             this.updateMetricUnit();
             this.UpdateThemeColors();
         },
@@ -1419,6 +1470,22 @@ define([
                 } else
                     this._originalTextFormProps = null;
 
+                var datePr = props.get_DateTimePr();
+                if (datePr && type == Asc.c_oAscContentControlSpecificType.DateTime) {
+                    this.labelFormName.text(this.textDateField);
+                    this._originalDateProps = datePr;
+                    var lang = datePr.get_LangId() || this.options.controlLang;
+                    if (lang) {
+                        var item = this.cmbLang.store.findWhere({value: lang});
+                        item = item ? item.get('value') : 0x0409;
+                        this.cmbLang.setValue(item);
+                    }
+                    this.updateDateFormats(this.cmbLang.getValue());
+                    var format = datePr.get_DateFormat();
+                    this.cmbDateFormat.setValue(format);
+                    this._state.DateFormat=format;
+                }
+
                 var isComplex = !!props.get_ComplexFormPr(), // is complex form
                     isSimpleInsideComplex = !!this.api.asc_GetCurrentComplexForm() && !isComplex;
 
@@ -1536,7 +1603,8 @@ define([
                 checkboxOnly = false,
                 radioboxOnly = false,
                 listOnly = false,
-                imageOnly = false;
+                imageOnly = false,
+                dateOnly = false;
             if (type == Asc.c_oAscContentControlSpecificType.ComboBox || type == Asc.c_oAscContentControlSpecificType.DropDownList) {
                 listOnly = !!specProps;
             } else if (type == Asc.c_oAscContentControlSpecificType.CheckBox) {
@@ -1546,6 +1614,8 @@ define([
                 }
             } else if (type == Asc.c_oAscContentControlSpecificType.Picture) {
                 imageOnly = true;
+            }  else if (type == Asc.c_oAscContentControlSpecificType.DateTime) {
+                dateOnly = true;
             } else if (type == Asc.c_oAscContentControlSpecificType.None || type == Asc.c_oAscContentControlSpecificType.Complex) {
                 textOnly = !!textProps;
             }
@@ -1560,6 +1630,7 @@ define([
             this.CheckOnlySettings.toggleClass('hidden', !value);
             this.FixedSettings.toggleClass('hidden', imageOnly || isSimpleInsideComplex);
             this.NotInComplexSettings.toggleClass('hidden', isSimpleInsideComplex);
+            this.DateOnlySettings.toggleClass('hidden', !dateOnly);
         },
 
         onSelectItem: function(listView, itemView, record) {
@@ -1675,6 +1746,40 @@ define([
             }
         },
 
+        updateDateFormats: function(lang) {
+            if (this._originalDateProps) {
+                var props = this._originalDateProps,
+                    formats = props.get_FormatsExamples(),
+                    arr = [];
+                for (var i = 0, len = formats.length; i < len; i++)
+                {
+                    arr.push({
+                        value: formats[i],
+                        displayValue: props.get_String(formats[i], undefined, lang)
+                    });
+                }
+                this.cmbDateFormat.setData(arr);
+                this.cmbDateFormat.setValue(arr[0].value);
+                if (this.api && !this._noApply)
+                    this.onDateFormatChanged();
+            }
+        },
+
+        onDateFormatChanged: function(combo, record) {
+            if (this.api && !this._noApply) {
+                var props   = this._originalProps || new AscCommon.CContentControlPr();
+                var formDatePr = this._originalDateProps || new AscCommon.CSdtDatePickerPr();
+                formDatePr.put_DateFormat(this.cmbDateFormat.getValue());
+                formDatePr.put_LangId(this.cmbLang.getValue());
+                props.put_DateTimePr(formDatePr);
+                this.api.asc_SetContentControlProperties(props, this.internalId);
+                this.fireEvent('editcomplete', this);
+            } else {
+                this.cmbDateFormat.setValue(this._state.DateFormat ? this._state.DateFormat : '');
+                this.fireEvent('editcomplete', this);
+            }
+        },
+
         textField: 'Text Field',
         textKey: 'Key',
         textPlaceholder: 'Placeholder',
@@ -1734,7 +1839,10 @@ define([
         textZipCodeUS: 'US Zip Code (e.g. 92663 or 92663-1234)',
         textUSSSN: 'US SSN (e.g. 123-45-6789)',
         textUKPassport: 'UK Passport Number (e.g. 925665416)',
-        textCreditCard: 'Credit Card Number (e.g 4111-1111-1111-1111)'
+        textCreditCard: 'Credit Card Number (e.g 4111-1111-1111-1111)',
+        textDateField: 'Date & Time Field',
+        textDateFormat: 'Display the date like this',
+        textLang: 'Language'
 
     }, DE.Views.FormSettings || {}));
 });
\ No newline at end of file